java验证json合法性_java校验json字符串是否合法

/**

* 用于校验一个字符串是否是合法的JSON格式

*

*/

import java.text.CharacterIterator;

import java.text.StringCharacterIterator;

public class JsonValidator {

private CharacterIterator it;

private char c;

private int col;

public JsonValidator() {

}

/**

*

* 验证一个字符串是否是合法的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;

}

public static void main(String[] args) {

String jsonStr = "{\"order_id\":\"1000088345\",\"status\":\"0\",\"pro_total_fee\":\"390.00\",\"order_created\":\"2013-12-26 12:11:11\",\"pay_time\":\"\",\"deliver_time\":\"\",\"finish_time\":\"\",\"payment\":\"390.00\",\"pay_mode_id\":\"2\",\"trans_price\":\"0.00\",\"seller_remark\":\"null\",\"order_product_list\":{\"order_product\":[{\"product_code\":\"1000251\",\"sku_id\":\"1000251\",\"cid\":\"\",\"unit_price\":\"145.00\",\"buy_count\":\"1\"},{\"product_code\":\"1000250\",\"sku_id\":\"1000250\",\"cid\":\"\",\"unit_price\":\"245.00\",\"buy_count\":\"1\"}]},\"UserInfo\":{\"fullname\":\"raymondji\",\"full_address\":\"西三条九号\",\"telephone\":\"\",\"mobile\":\"13800138000\",\"province\":\"北京\",\"city\":\"北京\",\"county\":\"中国\"}}";

System.out.println(jsonStr + ":"

+ new JsonValidator().validate(jsonStr));

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值