java校验字符串是否为json格式
觉得挺好玩的一个问题,如何校验字符串是否为标准的json格式,刚开始的回答是jsonObject或者jsonArray转换一下,如果可以转换,说明为json字符串,如果不能就抛出异常,捕获异常。
但是不让用这种方式。于是查资料从字符串和字符下手。
package com.lsm.util;import java.text.CharacterIterator;
import java.text.StringCharacterIterator;
/*** 用于校验一个字符串是否是合法的JSON格式* @author liShuMin**/
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\":\"oschina.net\"}";String jsonStr = "{"+ " \"ccobjtypeid\": \"1001\","+ " \"fromuser\": \"李四\","+ " \"touser\": \"张三\","+ " \"desc\": \"描述\","+ " \"subject\": \"主题\","+ " \"attach\": \"3245,3456,4345,4553\","+ " \"data\": {"+ " \"desc\": \"测试对象\","+ " \"dataid\": \"22\","+ " \"billno\": \"TEST0001\","+ " \"datarelation\":["+ " {"+ " \"dataname\": \"关联对象1\","+ " \"data\": ["+ " {"+ " \"dataid\": \"22\","+ " \"datalineid\": \"1\","+ " \"content1\": \"test1\","+ " \"content2\": \"test2\""+ " }"+ " ]"+ " }"+ " ]"+ " }"+ " }";System.out.println(jsonStr+":"+new JsonValidator().validate(jsonStr));}
}
转载于:https://www.cnblogs.com/wudi521/p/6380993.html
java校验字符串是否为json格式相关推荐
- java 校验字符串是否是 json 格式
java 校验字符串是否是 json 格式 package net.qh.boss.sms.utils;import com.alibaba.fastjson.JSONObject; import c ...
- Jquery 将后台返回的字符串转换成Json格式的数据
//code by:博客园-曹永思 第一步:将DataTable转换成 Json格式的数据 方法 一 View Code /// <summary>/// DataTable转成Json格 ...
- (转)解决fasterxml中string字符串转对象json格式错误问题(无引号 单引号问题)...
原文地址:解决fasterxml中string字符串转对象json格式错误问题 com.fasterxml.jackson.databind.ObjectMapper mapper = new com ...
- JS 判断字符串是否为JSON格式
JS 判断字符串是否为JSON格式 参数:字符串 function strIsJSON(str) {// 判断是否为字符串if (typeof str == 'string') {try {// 解析 ...
- java判断字符串是json_java中如何判断字符串是否为json格式
1.简单判断是否为json格式 ,判断规则:判断首尾字母是否为{}或[],如果都不是则不是一个JSON格式的文本. 代码实现如下:public static boolean getJSONType(S ...
- 在远程调用别人接口的时候,传输参数一般都是String类型的字符串,改字符串可以是json格式的,也可以是xml格式的,那么问题来了
在远程调用接口的时候,传输参数一般都是String类型的字符串,该字符串可以是json规则格式的,也可以是xml规则格式的,那么问题来了. 怎么将自己的对象,拼接成接口规定的格式?即将非格式化的数据( ...
- Java如何处理前端传来的json格式的数据并将它转化为相应的对象,然后进行使用
我是小康小白,一个平平无奇的Java小白.热爱有趣的文字,生活和远方. 前端传来json格式的数据传递而来,如何处理json格式的数据,如何将其转化为对象方便进行操作,并在Servlet页面中将数据以 ...
- java中的json_Java中Json格式总结
Java中Json格式总结 JSON(JavaScript Object Notation) 是一种轻量级的基于文本的数据交换格式.它采用完全独立于语言的文本格式,易于读写同时也易于机器解析和生成(网 ...
- java 将 ResultSet 转化为 json格式
现在有很多json相关的Java工具,如json-lib.gson等,它们可以直接把JavaBean转换成json格式. 在开发中,可能会从数据库中获取数据,希望直接转成json数组,中间不通过bea ...
最新文章
- 机器学习(MACHINE LEARNING)MATLAB动态规划解决背包问题
- 一文搞懂mysql:mysql学习目录链接大全
- MVC视图中处理Json
- 收藏 | 深度学习框架简史:TensorFlow和PyTorch双头垄断
- c语言贪吃蛇咬到尾巴,【图片】C语言小游戏~贪吃蛇【c语言吧】_百度贴吧
- mysql elt interval_mysql 区间分组 interval,elt 的运用
- 加工中心宏程序生成器_数控加工中心通用铣螺纹宏程序
- C#调用js,js调用C#
- vs2005开发Silverlight平台搭建
- 解决 vim 中文编码问题
- 单片机学习笔记(数码管)
- Guava Cache 过期回源
- cassandra java cql_使用Cassandra CQL Java Driver 访问Lindorm
- 淘宝电商数据分析-Python
- 猴子吃桃问题 (15分) (递归)
- 智商黑洞(门萨Mensa测试)9
- java writeint_java的writeInt() 函数怎么用啊
- quot转双引号 php,js把 quot 转义双引号
- 10以内随机加、减法练习题
- 2019年了,中国汽车行业还有多少黑洞?