/**

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

}

}

java验证json合法性_java校验json字符串是否合法相关推荐

  1. java验证身份证合法性_Java安全性,第2部分:身份验证和授权

    关于本教程 本教程是关于什么的? 也许没有比应用程序安全更重要的软件工程主题. 攻击是昂贵的,无论是来自内部还是外部,而且某些攻击可能会使软件公司承担赔偿责任. 随着计算机(尤其是Internet)技 ...

  2. java 验证手机号格式_java 校验手机号格式

    主要用到这两个包: import java.util.regex.Matcher; import java.util.regex.Pattern; Pattern类用于创建一个正则表达式,生成一个Pa ...

  3. java验证图片大小_java 校验图片的大小、尺寸、比例

    import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.i ...

  4. java json自定义_java返回json设置自定义的格式

    springMvc返回Json中自定义日期格式 (一)输出json数据 springmvc中使用jackson-mapper-asl即可进行json输出,在配置上有几点: 1.使用mvc:annota ...

  5. java 如何导出json文件_java导出json格式文件的示例代码

    本文介绍了java导出json格式文件的示例代码,分享给大家,具体如下: import java.io.File; import java.io.FileWriter; import java.io. ...

  6. java封装对象数组_java解析JSON对象和封装对象的示例

    在本例中java解析JSON对象使用的是org.json,因此,如果各位想测试我的代码,请先确保有java.json.jar包,否则,就需要去网上下载这个jar包,然后才可以正常使用本代码. 本例的功 ...

  7. java读取json文件_Java 读取Json文件内容

    读取json文件为String类型: import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logge ...

  8. java服务端 json接口_java以json格式向后台服务器接口发送请求的实例

    java以json格式向后台服务器接口发送请求的实例 发布于 2021-1-14| 复制链接 下面小妖就为大家分享一篇java以json格式向后台服务器接口发送请求的实例,具有很好的参考价值,希望对大 ...

  9. java解析json数据_java解析JSON数据详解

    JSON是目前最流行的轻量级数据交换语言(没有之一).尽管他是javaScript的一个子集.但由于其是独立与语言的文本格式,它几乎可以被所有编程语言所支持. 以下是对java语言中解析json数据的 ...

最新文章

  1. ftp 主动或者被动ftp
  2. bike with a famous logo
  3. HDU1527 - 取石子游戏【威佐夫博弈】
  4. python离线安装依赖包_python离线安装外部依赖包的实现
  5. SpringBoot从零单排 ------ 拦截器的使用
  6. 简述关系型数据库和非关系型数据库
  7. python shell怎么调字体大小_如何更改在Python Shell字体大小
  8. 测试面试中的常见10道接口面试题
  9. 如何计算Lyapunov exponent spectrum?matlab计算李雅普诺夫指数
  10. 使用脚本自制 SSL 域名证书
  11. 80286微处理器和80386的优缺点
  12. 《私募股权基金投资基础知识》---第三章
  13. 【智能优化算法-灰狼算法】基于非支配排序灰狼优化器(NS-GWO)算法求解多目标优化算法附matlab代码
  14. easyui手风琴菜单
  15. 解决height:100vh超出屏幕高度的问题
  16. Google开放星空观测应用SkyMap源代码
  17. Selenium IDE安装与运行
  18. html 抽奖的页面,html网页抽奖
  19. ACS服务器的备份和恢复
  20. 批发供应系统批发订货发货管理系统开发功能

热门文章

  1. Vue3@cli项目结构
  2. Android工程Gradle仓库配置及说明
  3. web端消息推送的方式介绍
  4. scala的数值类型(三)
  5. ReplaceAll()和Replace的实战用法
  6. jsx怎么往js里传参数_给js文件传参数(详解)
  7. Java集合List,Set,Map,Queue,Deque
  8. OpenShift4 - 使用 Service CA 证书增加内部通讯安全
  9. OpenShift 4 之 配置基于Red Hat SSO的Identity Providers
  10. 使用Jenkins在Azure Web App上进行ASP.NET Core应用程序的持续集成和部署(CI/CD)–第1天