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 LV30
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 LV30
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日