在此博文基础上增添了更多校验功能https://blog.csdn.net/weixin_42540829/article/details/88326880

   public static final class RouteTableJsonValidator {/*** 数组指针*/private static int index;/*** 字符串*/private static String value;/*** 指针当前字符*/private static char curchar;/*** 工具类非公有构造函数*/private RouteTableJsonValidator() {}/*** @param rawValue 字符串参数* @return boolean 是否是JSON*/public static boolean isJSON(String rawValue) throws Exception {index = 0;value = rawValue;switch (nextClean()) {case '[':if (nextClean() == ']') {return true;}back();return validateArray();case '{':if (nextClean() == '}') {return true;}back();return validateObject();default:return false;}}/*** @return char 下一个有效实义字符 char<=' ' char!=127* @throws JSONException 自定义JSON异常*/public static char nextClean() throws JSONException {skipComment:do {next();if (curchar == '/') { // 跳过//类型与/*类型注释 遇回车或者null为注释内容结束switch (next()) {case 47: // '/'do {curchar = next();} while (curchar != '\n' && curchar != '\r' && curchar != 0);continue;case 42: // '*'do {do {next();if (curchar == 0) {throw syntaxError("Unclosed comment");}} while (curchar != '*');if (next() == '/') {continue skipComment;}back();} while (true);}back();return '/';}if (curchar != '#') { //跳过#类型注释 遇回车或者null为注释内容结束break;}do {next();} while (curchar != '\n' && curchar != '\r' && curchar != 0);} while (true);if (curchar != 0 && (curchar <= ' ' || curchar == 127)) {throw syntaxError("JSON can not contain control character!");}return curchar;}/*** @return char 下一个字符*/public static char next() {if (index < 0 || index >= value.length()) {return '\0';}curchar = value.charAt(index);if (curchar <= 0) {return '\0';} else {index++;return curchar;}}/*** 将指针移至上一个字符,回退一位*/public static void back() { //异常在next中进行返回nullindex--;}/*** @param message 异常自定义信息* @return JSONException 自定义JSON异常*/public static JSONException syntaxError(String message) {return new JSONException((new StringBuilder(String.valueOf(message))).toString());}/*** @return boolean 是否是JSONArray* @throws JSONException 自定义JSON异常*/public static boolean validateArray() throws JSONException {do {//入口为合法 [ array 起点nextClean(); //下一位有效字符,跳过注释if (curchar == ']') { //空array 直接闭合返回return true;} else if (curchar == ',') { //nullcontinue;} else if (curchar == '"') { //StringvalidateString();} else if (curchar == '-' || (curchar >= 48 && curchar <= 57)) { // numbervalidateNumber();} else if (curchar == '{') { // objectif (!validateObject()) { //递归校验return false;}} else if (curchar == '[') { // arrayif (!validateArray()) { //递归校验return false;}} else if (curchar == 't' || curchar == 'f' || curchar == 'n') { // boolean and JSONNullvalidateBooleanAndNull();} else {return false;}switch (nextClean()) {case ',':continue;case ']':return true;default:return false;}} while (true);}/*** @return boolean 是否是JSONObject* @throws JSONException 自定义JSON异常*/public static boolean validateObject() throws JSONException {do {nextClean();if (curchar == '}') {return true;} else if (curchar == '"') { //StringvalidateString();} else {return false;}if (nextClean() != ':') {return false;}nextClean();if (curchar == ',') { //nullthrow syntaxError("Missing value");} else if (curchar == '"') { //StringvalidateString();} else if (curchar == '-' || (curchar >= 48 && curchar <= 57)) { // numbervalidateNumber();} else if (curchar == '{') { // objectif (!validateObject()) {return false;}} else if (curchar == '[') { // arrayif (!validateArray()) {return false;}} else if (curchar == 't' || curchar == 'f' || curchar == 'n') { // boolean and JSONNullvalidateBooleanAndNull();} else {return false;}switch (nextClean()) {case ',':continue;case '}':return true;default:return false;}} while (true);}/*** @throws JSONException 自定义JSON异常*/public static void validateString() throws JSONException {StringBuilder sb = new StringBuilder();do {curchar = next(); //JSON对字符串中的转义项有严格规定sb.append(curchar);if (curchar == '\\') {if ("\"\\/bfnrtu".indexOf(next()) < 0) {throw syntaxError("Invalid escape string");}if (curchar == 'u') { //校验unicode格式 后跟4位16进制 0-9 a-f A-Ffor (int i = 0; i < 4; i++) {next();if (curchar < 48 || (curchar > 57 && curchar < 65) || (curchar > 70 && curchar < 97)|| curchar > 102) {throw syntaxError("Invalid hexadecimal digits");}}}}} while (curchar >= ' ' && "\":{[,#/".indexOf(curchar)< 0 && curchar != 127);if (curchar == 0) { //仅正常闭合双引号可通过throw syntaxError("Unclosed quot");} else if (curchar != '"') {throw syntaxError("Invalid string {\""+ sb +"}, missing quot ");} else if (value.charAt(index)=='"') {throw syntaxError("Missing comma after string: \"" + sb);} else if (value.charAt(index)==':' ) {String str = sb.substring(0, sb.length() - 1);
//                if (!validateRouteTableKey(sb.charAt(0), str)) {
//                    throw syntaxError("Invalid RouteTable KEY:\"" + sb);
//                }validateRouteTableValue(str);}}/*** @throws JSONException 自定义JSON异常*/public static void validateNumber() throws JSONException {StringBuilder sb = new StringBuilder();if (curchar == '-') { //可选负号curchar = next();}if (curchar > 48 && curchar <= 57) { //整数部分do {sb.append(curchar);curchar = next();} while (curchar >= 48 && curchar <= 57);} else if (curchar == 48) {curchar = next();} else {throw syntaxError("Invalid number");}if (curchar == '.') { //小数部分do { //.后可不跟数字 如 5. 为合法数字curchar = next();} while (curchar >= 48 && curchar <= 57);}if (curchar == 'e' || curchar == 'E') { //科学计数部分curchar = next();if (curchar == '+' || curchar == '-') {curchar = next();}if (curchar < 48 || curchar > 57) {throw syntaxError("Invalid number");}do {curchar = next();} while (curchar >= 48 && curchar <= 57);}if (curchar == '"') {throw syntaxError("Missing comma after number: " + sb);}back(); //指针移至数字值最后一位,取下一位即判断是,或者],或者是合法注释}public static void validateRouteTableValue(String key) throws JSONException {int a = index;char c,d ;List<String> num_list = Arrays.asList("port");List<String> boolean_list = Arrays.asList("useSSL", "default_allow");do {++a;c = value.charAt(a);} while (c == ' ' || c == '"');StringBuilder sb = new StringBuilder();do {d = value.charAt(a);sb.append(d);a++;} while (d !=' ' && ",]}\"".indexOf(d) <0);String str = sb.substring(0,sb.length()-1);if (num_list.contains(key) && !(c == '-' || (c >= 48 && c <= 57))) {throw syntaxError("RouteTable KEY:" + key + " match NumberType");}if (boolean_list.contains(key) && !(c == 't' || c == 'f' || c == 'n')) {throw syntaxError("RouteTable KEY:" + key + " match BooleanType");}String port_reg = "^([0-5]?\\d{0,4}|6[0-4]\\d{3}|65[0-4]\\d{2}|655[0-2]\\d|6553[0-5])$";if("port".equals(key) && !str.matches(port_reg)){throw syntaxError("Invalid Port : " + str);}String ip_reg = "^(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}$";if("ip".equals(key) && !str.matches(ip_reg)){throw syntaxError("Invalid ip : " + str);}}public static boolean validateRouteTableKey(char firstChar, String str) throws JSONException {if ("".equals(str)) return false;List<String> a_list = Arrays.asList("allow");List<String> c_list = Arrays.asList("certChainFile","caFile","coordinator");List<String> d_list = Arrays.asList("default", "default_allow","deny");List<String> f_list = Arrays.asList("from");List<String> h_list = Arrays.asList("host");List<String> i_list = Arrays.asList("ip");List<String> n_list = Arrays.asList("negotiationType","caFile");List<String> p_list = Arrays.asList("permission", "port", "privateKeyFile");List<String> r_list = Arrays.asList("route_table","role");List<String> s_list = Arrays.asList("serving");List<String> t_list = Arrays.asList("to");List<String> u_list = Arrays.asList("useSSL");switch (firstChar) {case ' ':return false;case 'a':return a_list.contains(str);case 'f':return f_list.contains(str);case 't':return t_list.contains(str);case 'i':return i_list.contains(str);case 'h':return h_list.contains(str);case 's':return s_list.contains(str);case 'u':return u_list.contains(str);case 'c':return c_list.contains(str);case 'n':return n_list.contains(str);case 'r':return r_list.contains(str);case 'd':return d_list.contains(str);case 'p':return p_list.contains(str);default:return true;}}/*** @throws JSONException 自定义JSON异常*/public static void validateBooleanAndNull() throws JSONException {StringBuilder sb = new StringBuilder();do {sb.append(curchar);curchar = next();} while (curchar >= ' ' && "\",]#/}".indexOf(curchar) < 0 && curchar != 127);if (!"null".equals(sb.toString()) && !"true".equals(sb.toString()) && !"false".equals(sb.toString())) {throw syntaxError("Boolean/null spelling errors : " + sb);}if (curchar == '"') {throw syntaxError("Missing comma after Boolean: " + sb);}back();}}public static void main(String[] args) {
//        String str = "{\"route_table\": {\"default\":{\"default\":[{\"ip\":\"127.0.0.1\",\"port\":9999,\"useSSL\":false}]},\"10000\":{\"default\":[{\"ip\":\"127.0.0.1\",\"port\":8889}],\"serving\":[{\"ip\":\"127.0.0.1\",\"port\":8080}]},\"123\":[{\"host\":\"10.35.27.23\",\"port\":8888,\"useSSL\":false,\"negotiationType\":\"\",\"certChainFile\":\"\",\"privateKeyFile\":\"\",\"caFile\":\"\"}]},\"permission\":{\"default_allow\":true}}";String str = "{\"route_table\":{\"default\":{\"default\":[{\"ip\":\"127.0.0.1\",\"port\":2345}]},\"10000\":{\"default\":[{\"ip\":\"127.0.0.1\",\"port\":8889}],\"serving\":[{\"ip\":\"127.0.0.1\",\"port\":8080}]}},\"permission\":{\"default_allow\":true,\"allow\":[{\"from\":{\"coordinator\":\"9999\",\"role\":\"guest\"},\"to\":{\"coordinator\":\"10000\",\"role\":\"host\"}}],\"deny\":[{\"from\":{\"coordinator\":\"9999\",\"role\":\"guest\"},\"to\":{\"coordinator\":\"10000\",\"role\":\"host\"}}]}}";try {if (RouteTableJsonValidator.isJSON(str)) {String s = JsonUtil.formatJson(str);System.out.println(s);}} catch (Exception e) {System.out.println(e.getMessage());}}

JAVA校验JSON数据格式相关推荐

  1. JAVA校验JSON数据格式最终版。

    在尝试了两次正则表达式进行校验,依然存在严重性能问题的情况下,为了寻求新的思路我查看了ORG.JSON的源代码,并获取了新的思路. 正则表达式校验JSON实际也是从前到后遍历字符与正则表达式进行匹配. ...

  2. 如何利用JSON Schema校验JSON数据格式

    最近笔者在工作中需要监控一批http接口,并对返回的JSON数据进行校验.正好之前在某前端大神的分享中得知这个神器的存在,调研一番之后应用在该项目中,并取得了不错的效果,特地在此分享给各位读者. 什么 ...

  3. java 校验json格式

    /**  * 用于校验一个字符串是否是合法的JSON格式  *   */ import java.text.CharacterIterator; import java.text.StringChar ...

  4. Python中json自定义jsonschema进行json数据格式校验

    一.python中jsonschma库 python中有时候我们想对json数据进行键值对(key,value)数据的数据格式进行校验,因为数据类型不符合业务逻辑会导致业务逻辑代码执行报错,这时候我们 ...

  5. java 蓝牙读取数据格式,单片机与安卓手机通过蓝牙串口模块利用JSON数据格式通信实例...

    原标题:单片机与安卓手机通过蓝牙串口模块利用JSON数据格式通信实例 JSON 指的是 Java 对象表示法(Java Object Notation),JSON 是轻量级的文本数据交换格式,JSON ...

  6. java schema校验_Json Schema 校验json,java代码示例

    Json Schema 校验json,java代码示例 1.json schema 入门请参考下面两篇博客 1.1Json Schema 快速入门 1.2Json Schema 简介 2.java代码 ...

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

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

  8. Json-lib, 实现Java对象与JSON数据格式的互转

    Json-lib 是什么? 官方解释是:JSON-lib is a java library for transforming beans, maps, collections, java array ...

  9. 利用JsonSchema校验json数据内容的合规性(转)

    原文地址:Json schema 背景: 复杂的AJAX应用程序可以与数百个不同的JSON服务进行交互,因此,引入对客户端验证的需求. 在处理校验问题方面有着很多的工具,但是通常可以将它们归为以下几类 ...

最新文章

  1. postgresql Insert插入的几个报错
  2. Openstack nova-scheduler 源码分析 — Filters/Weighting
  3. java.util.concurrent.locks.Lock 接口 源码
  4. Morpheus - DNS Spoofing
  5. 函数内联inline
  6. 一、 kettle开发、上线常见问题以及防错规范步骤
  7. 使用javascript操作cookies的实例
  8. 学习 TList 类的实现[1]
  9. 干货 | 100大产业链全景图
  10. 【图像融合】基于matlab curvelet变换图像融合【含Matlab源码 776期】
  11. python分类时特征选择_推荐 :使用Python实现机器学习特征选择的4种方法(附代码)...
  12. 苹果软解ID软件(X.PASSWORD-XIMEI 苹果id锁)--上帝左手汉化组(内附即时更新)
  13. 天线3db波束宽度_天线尺寸与频率,口径与波宽的关系
  14. 只利用热点事件就能吸粉引流?白日做梦!
  15. 好心情:抗抑郁药物的不良反应和处理措施
  16. 既是消费者也是管理者:纽约州分布式能源改革
  17. 一年节省费用100万,AI导航误差不到1米,杭州奥体“大小莲花”智慧场馆大揭秘...
  18. ltspice语言中文_LTspice下载|LTspice(电路仿真软件)下载v4.14r 中文免费版 附安装教程 - 欧普软件下载...
  19. halcon notes
  20. js数组几种常见的操作方法攻略

热门文章

  1. 计算机毕业设计Java大学生活动中心场地管理系统(源码+系统+mysql数据库+lw文档)
  2. 一起学习gurobi
  3. async\await 的使用
  4. php sku设计,PHP 产品库 SPU、SKU 如何设计?
  5. 一次拍图完成手机双摄标定的方法
  6. 黄中原-绝口不提爱你
  7. Kotlin读书笔记之内联函数、扩展函数、匿名函数、lambda
  8. 从Authy中导出账户和secret
  9. 708 循环有序列表的插入
  10. Linux发行版概览