对JSON字符串进行格式校验,不依赖于第三方包
package com.iaiai.test;
import java.text.CharacterIterator;
import java.text.StringCharacterIterator;
/**
*
* <br/>
* Title: JsonValidator.java<br/>
* E-Mail: 176291935@qq.com<br/>
* QQ: 176291935<br/>
* Http: iaiai.iteye.com<br/>
* Create time: 2013-1-29 上午11:29:09<br/>
* <br/>
*
* @author 丸子
* @version 0.0.1
*/
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 = "{\"website\":\"1.11\"}";
System.out.println(jsonStr + ":" + new JsonValidator().validate(jsonStr));
}
}
分享到:
相关推荐
json数据交互时作为校验是否通过,用于后台需要构建json返回前台必备
JSON Schema 校验库——json-schema-validator(java版本).rar
json校验工具,支持 1.json字符串格式化 2.json格式错误报错,找出报错所在行并标出
校验字符串 是否符合json书写规范 项目中的 共同工具类 简单易用
可格式化json,方便浏览,可检验json,检查json是否有效
java代码-使用java解决json字符串格式化的源代码 ——学习参考资料:仅用于个人学习使用!
java json工具类,支持各种json对象,json数组与json字符串转换,json格式校验等。
由于传输内容以json格式传输的方式越来越多且传输入格式有时也比较复杂,在代码里添加不同的判断来验证json内容是否合法时将造成不易维护所以写了一个比较通用的json内容合法性验证
1. 通过解析Json对象实现格式化输出; 2. 支持特殊字符;
JSON-Validator-Java:Java中的JSON对象验证
JSON数据格式检验,JSON数据类型检验,JSON数据检验,用于校验两个JSON字符串是否一样,包括数据格式一样,数据类型一样,数据值一样
java的get和post请求,获取json的工具类,https时会存在ssl校验的问题,工具会自动去除ssl校验。
jsonschema2pojo从JSON模式(或示例JSON)生成Java类型,并可以注释这些类型以便与Jackson 1.x,Jackson 2.x或Gson进行数据绑定。 注意:在0.5.1和1.0.0之间存在重大变化。 检查。 1.0.0 Alpha,Beta和最终版本中...
乔森·帕瑟(JoeSON-Parser) Java中的简单JSON解析器,可将地图的数组列表解析为JSON格式,反之亦然。
基于Java的Json描述器,解决项目当中字段多,且多个字段需要进行判定以及校验的问题
本工程有两种ajax异步校验注册时输入的username是否与数据库中的值重复,通过mybatis实现数据库,通过servlet或者struts2实现控制层,通过ajax,jquery,json,实现异步校验
原创代码,http://blog.csdn.net/weinianjie1/archive/2011/06/22/6561788.aspx,时间有限,简单的分析测试一下,以后有时间继续改进。
SSM笔记-SpringMVC的数据格式化 、数据校验、错误提示、错误信息国际化、返回json
jackson优势: (1)Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。 (2)相比json-lib框架,Jackson所...附加JSON数据格式化和查看器,方便JSON数据测试和校验,有利于开发。
可以直接将gson和bean-validation框架结合,校验Java对象的字段。 4. 支持基本数据类型及其封装类型,Collection类型,Date类型及自定义类型。 5. 支持将JSON数组转换为Java数组或List,支持泛型。 6. 支持将Java的Map...