觉得挺好玩的一个问题,如何校验字符串是否为标准的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格式相关推荐

  1. java 校验字符串是否是 json 格式

    java 校验字符串是否是 json 格式 package net.qh.boss.sms.utils;import com.alibaba.fastjson.JSONObject; import c ...

  2. Jquery 将后台返回的字符串转换成Json格式的数据

    //code by:博客园-曹永思 第一步:将DataTable转换成 Json格式的数据 方法 一 View Code /// <summary>/// DataTable转成Json格 ...

  3. (转)解决fasterxml中string字符串转对象json格式错误问题(无引号 单引号问题)...

    原文地址:解决fasterxml中string字符串转对象json格式错误问题 com.fasterxml.jackson.databind.ObjectMapper mapper = new com ...

  4. JS 判断字符串是否为JSON格式

    JS 判断字符串是否为JSON格式 参数:字符串 function strIsJSON(str) {// 判断是否为字符串if (typeof str == 'string') {try {// 解析 ...

  5. java判断字符串是json_java中如何判断字符串是否为json格式

    1.简单判断是否为json格式 ,判断规则:判断首尾字母是否为{}或[],如果都不是则不是一个JSON格式的文本. 代码实现如下:public static boolean getJSONType(S ...

  6. 在远程调用别人接口的时候,传输参数一般都是String类型的字符串,改字符串可以是json格式的,也可以是xml格式的,那么问题来了

    在远程调用接口的时候,传输参数一般都是String类型的字符串,该字符串可以是json规则格式的,也可以是xml规则格式的,那么问题来了. 怎么将自己的对象,拼接成接口规定的格式?即将非格式化的数据( ...

  7. Java如何处理前端传来的json格式的数据并将它转化为相应的对象,然后进行使用

    我是小康小白,一个平平无奇的Java小白.热爱有趣的文字,生活和远方. 前端传来json格式的数据传递而来,如何处理json格式的数据,如何将其转化为对象方便进行操作,并在Servlet页面中将数据以 ...

  8. java中的json_Java中Json格式总结

    Java中Json格式总结 JSON(JavaScript Object Notation) 是一种轻量级的基于文本的数据交换格式.它采用完全独立于语言的文本格式,易于读写同时也易于机器解析和生成(网 ...

  9. java 将 ResultSet 转化为 json格式

    现在有很多json相关的Java工具,如json-lib.gson等,它们可以直接把JavaBean转换成json格式. 在开发中,可能会从数据库中获取数据,希望直接转成json数组,中间不通过bea ...

最新文章

  1. 机器学习(MACHINE LEARNING)MATLAB动态规划解决背包问题
  2. 一文搞懂mysql:mysql学习目录链接大全
  3. MVC视图中处理Json
  4. 收藏 | 深度学习框架简史:TensorFlow和PyTorch双头垄断
  5. c语言贪吃蛇咬到尾巴,【图片】C语言小游戏~贪吃蛇【c语言吧】_百度贴吧
  6. mysql elt interval_mysql 区间分组 interval,elt 的运用
  7. 加工中心宏程序生成器_数控加工中心通用铣螺纹宏程序
  8. C#调用js,js调用C#
  9. vs2005开发Silverlight平台搭建
  10. 解决 vim 中文编码问题
  11. 单片机学习笔记(数码管)
  12. Guava Cache 过期回源
  13. cassandra java cql_使用Cassandra CQL Java Driver 访问Lindorm
  14. 淘宝电商数据分析-Python
  15. 猴子吃桃问题 (15分) (递归)
  16. 智商黑洞(门萨Mensa测试)9
  17. java writeint_java的writeInt() 函数怎么用啊
  18. quot转双引号 php,js把 quot 转义双引号
  19. 10以内随机加、减法练习题
  20. 2019年了,中国汽车行业还有多少黑洞?

热门文章

  1. 从全球最大光伏展看中国光伏行业:火爆的背后是什么?
  2. 在IIS(64位)上部署WCF服务访问Oracle数据库
  3. asp.net传递参数
  4. 云网融合 — 基于 SD-DCI 的云间网络融合
  5. PostgreSQL — Overview
  6. 用 C 语言开发一门编程语言 — 字符串与文件加载
  7. OpenStack 虚拟机的配置初始化 — Cloud-Init Config Drive | Metadata API
  8. Markdown语法整理
  9. 安卓蓝牙调试软件和微信小程序搜索不到设备
  10. NR 5G 非3GPP 接入到核心网络的安全性