首页>代码>java多层json递归解析转换工具类代码分享>/myweb/src/com/matols/tools/JsonValidator.java
package com.matols.tools;

import java.text.CharacterIterator;
import java.text.StringCharacterIterator;

/**
 * 用于校验一个字符串是否是合法的JSON格式
 * {}是Object  []是Array
 * 王伟
 * 2014-12-05
 */
public class JsonValidator {
 
    private CharacterIterator it;
    private char              c;
    private int               col;
 
    public static void main(String[] args){
    	String jsonStr = "{\"transactionInfo\":{\"transactionId\":\"\",\"transactionType\":\"\",\"transactionExeDate\":\"\",\"transactionExeTime\":\"\"},\"channelInfo\":{\"sellingChannelCode\":\"\",\"clientSystemId\":\"\",\"agency\":\"\",\"agent\":\"\",\"customerManager\":\"\"},\"response\":{\"status\":{\"statusCode\":\"400\",\"statusMessage\":[]},\"quote\":{\"amnt\":\"\",\"prem\":\"\",\"effectiveDate\":\"2015-01-01\",\"expirationDate\":\"2016-01-01\",\"components\":[{\"riskCode\":\"RA001\",\"amnt\":\"100000\",\"prem\":\"10\"},{\"riskCode\":\"RA002\",\"amnt\":\"200000\",\"prem\":\"20\"}]}}}";
    	
        System.out.println("["+new JsonValidator().validate(jsonStr)+"]"+jsonStr);
    }
 
    /**
     * 验证一个字符串是否是合法的JSON串
     * @param input 要验证的字符串
     * @return true-合法 ,false-非法
     */
    public boolean validate(String input) {
        input = input.trim();
        boolean ret = valid(input);
        return ret;
    }
    private boolean valid(String input) {
        if ("".equals(input)) return true;
 
        boolean ret = true;
        it = new StringCharacterIterator(input);
        c = it.first();
        col = 1;
        if (!value()){
            ret = error("value", 1);
        }else{
            skipWhiteSpace();
            if(c != CharacterIterator.DONE){
                ret = error("end", col);
            }
        }
 
        return ret;
    }
 
    private boolean value() {
        return literal("true") || literal("false") || literal("null") || string() || number() || object() || array();
    }
    private boolean literal(String text) {
        CharacterIterator ci = new StringCharacterIterator(text);
        char t = ci.first();
        if (c != t) return false;
 
        int start = col;
        boolean ret = true;
        for (t = ci.next(); t != CharacterIterator.DONE; t = ci.next()) {
            if (t != nextCharacter()) {
                ret = false;
                break;
            }
        }
        nextCharacter();
        if (!ret) error("literal " + text, start);
        return ret;
    }
 
    private boolean array() {
        return aggregate('[', ']', false);
    }
    private boolean object() {
        return aggregate('{', '}', true);
    }
 
    private boolean aggregate(char entryCharacter, char exitCharacter, boolean prefix) {
        if (c != entryCharacter) return false;
        nextCharacter();
        skipWhiteSpace();
        if (c == exitCharacter) {
            nextCharacter();
            return true;
        }
 
        for (;;) {
            if (prefix) {
                int start = col;
                if (!string()) return error("string", start);
                skipWhiteSpace();
                if (c != ':') return error("colon", col);
                nextCharacter();
                skipWhiteSpace();
            }
            if (value()) {
                skipWhiteSpace();
                if (c == ',') {
                    nextCharacter();
                } else if (c == exitCharacter) {
                    break;
                } else {
                    return error("comma or " + exitCharacter, col);
                }
            } else {
                return error("value", col);
            }
            skipWhiteSpace();
        }
 
        nextCharacter();
        return true;
    }
 
    private boolean number() {
        if (!Character.isDigit(c) && c != '-') return false;
        int start = col;
        if (c == '-') nextCharacter();
        if (c == '0') {
            nextCharacter();
        } else if (Character.isDigit(c)) {
            while (Character.isDigit(c))
                nextCharacter();
        } else {
            return error("number", start);
        }
        if (c == '.') {
            nextCharacter();
            if (Character.isDigit(c)) {
                while (Character.isDigit(c))
                    nextCharacter();
            } else {
                return error("number", start);
            }
        }
        if (c == 'e' || c == 'E') {
            nextCharacter();
            if (c == '+' || c == '-') {
                nextCharacter();
            }
            if (Character.isDigit(c)) {
                while (Character.isDigit(c))
                    nextCharacter();
            } else {
                return error("number", start);
            }
        }
        return true;
    }
 
    private boolean string() {
        if (c != '"') return false;
 
        int start = col;
        boolean escaped = false;
        for (nextCharacter(); c != CharacterIterator.DONE; nextCharacter()) {
            if (!escaped && c == '\\') {
                escaped = true;
            } else if (escaped) {
                if (!escape()) {
                    return false;
                }
                escaped = false;
            } else if (c == '"') {
                nextCharacter();
                return true;
            }
        }
        return error("quoted string", start);
    }
 
    private boolean escape() {
        int start = col - 1;
        if (" \\\"/bfnrtu".indexOf(c) < 0) {
            return error("escape sequence  \\\",\\\\,\\/,\\b,\\f,\\n,\\r,\\t  or  \\uxxxx ", start);
        }
        if (c == 'u') {
            if (!ishex(nextCharacter()) || !ishex(nextCharacter()) || !ishex(nextCharacter())
                || !ishex(nextCharacter())) {
                return error("unicode escape sequence  \\uxxxx ", start);
            }
        }
        return true;
    }
 
    private boolean ishex(char d) {
        return "0123456789abcdefABCDEF".indexOf(c) >= 0;
    }
    private char nextCharacter() {
        c = it.next();
        ++col;
        return c;
    }
 
    private void skipWhiteSpace() {
        while (Character.isWhitespace(c)) {
            nextCharacter();
        }
    }
    private boolean error(String type, int col) {
        //System.out.printf("type: %s, col: %s%s", type, col, System.getProperty("line.separator"));
        return false;
    }
}

最近下载更多
微信网友_6278404180119552  LV1 2022年12月26日
ewan007  LV29 2021年10月21日
Alexyin  LV1 2020年12月1日
拎壶冲666  LV1 2020年9月24日
csy1209457788  LV3 2020年6月10日
唐少darks  LV13 2020年4月21日
芬苯的样  LV1 2020年3月10日
wgjair19940901  LV1 2019年12月23日
qwe8625291  LV1 2019年11月15日
平头哥  LV1 2019年10月31日
最近浏览更多
微信网友_6278404180119552  LV1 2022年12月26日
sky丶小十  LV7 2022年10月14日
fengzhongye 2022年3月2日
暂无贡献等级
ewan007  LV29 2021年10月21日
狐言不语  LV5 2021年6月26日
xiaoche117  LV17 2021年4月8日
Alexyin  LV1 2020年12月1日
chenbo2327  LV2 2020年11月25日
wkc  LV21 2020年7月26日
zhangtian1997  LV10 2020年6月22日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友