JSONTools Validator的使用

Stella981
• 阅读 430
  1. 此包的主要用途:

  2. Parser: Parse JSON text files and convert these to a Java model.

  3. Renderer: Render a Java representation into text.

  4. Serializer: Serialize plain POJO clusters to a JSON representation. The goal is to provide a serializing mechanism which can cope with all kinds of Java datastructures (recursion, references, primitive types, ...) .

  5. Mapper: Map POJO to JSON, this time the JSON text should be as clean as possible. This tool is the best choice when data has to be communicated between Java and other programming languages who can parse JSON.

  6. Validator: Validate the contents of a JSON file using a JSON schema.

以下来介绍一下Validator的使用
1.可以查看jsontools-core-1.7-sources.jar文件中的源代码validator-validator.json,这里介绍了json schema验证文件的写法。
(1)name:规则名称
(2)type:验证的类型,包括let、and、or、array、properties、ref、content、string、number、bool等
(3)let类型:
*后指定的是let所执行的验证规则,通常这是验证文件中的最外层元素,并告诉当验证执行时,执行的是哪个规则;
rules是一个数组,里面存放所定义的规则
(4)and类型:
rules后指定的是一个数组,内是几个规则,它们之间是and的关系
(5)or类型:
rules后指定的是一个数组,内是几个规则,它们之间是or的关系
(6)array类型:
代表数组
(7)properties类型:
pairs后指定的是一个数组,其内可以指定属性;key指定属性名,optional指定属性是否可选,rule指定属性的规则
(8)ref类型:
可以引用文件中定义的规则;
*后可以指定引用的规则名称
(9)content类型:
内容类型;
rule后可以指定content的规则
(10)string类型:
代表字符串
(11)number类型:
代表数字
(12)bool类型:
代表布尔值

另外,还有其他的规则类型,可以分析com.sdicons.json.validator包,来得知其中的含义。

**2.简单模式
**假设json格式为:
{
"links":[{"text":"文本","url":"链接"},{"text":"文本","url":"链接"}]
}

则相应的json schema为:
{
"name":"links-validator",
"type":"let",
"*":"links-rule",
"rules":
[
{
  "name":"link-rule",
  "type":"properties",
  "pairs":[
    {"key":"text","optional":false,"rule":{"type":"string"}},
    {"key":"url","optional":false,"rule":{"type":"string"}}
  ]
}
,
{
  "name":"links-rule",
  "type":"properties",
  "pairs":[
    {"key":"links","optional":false,"rule":{
      "type":"and",
      "rules":[
        {"type":"array"},
        {"type":"content","rule":{"type":"ref","*":"link-rule"}}
      ]
     }
    }
  ]
}
]
}

**3.复杂模式
**假设json格式为:
{
"actors":[{"text":"文字","url":"链接"},{"text":"文字","url":"链接"}],
"targets":[{"text":"文字","url":"链接"},{"text":"文字","url":"链接"}],
"resources":[{"text":"文字","url":"链接"},{"text":"文字"},{"text":"文字","url":"链接","src":"图片路径"}],
"props":[{"key":"key1","value":"value1"},{"key":"key2","value":"value2"}]
}

则相应的json schema为:
{
"name":"body-validator",
"type":"let",
"*":"body-rule",
"rules":
[
{
  "name":"link-rule",
  "type":"properties",
  "pairs":[
    {"key":"text","optional":false,"rule":{"type":"string"}},
    {"key":"url","optional":false,"rule":{"type":"string"}}
  ]
}
,
{
  "name":"msg-rule",
  "type":"properties",
  "pairs":[
    {"key":"text","optional":false,"rule":{"type":"string"}}
  ]
}
,
{
  "name":"image-rule",
  "type":"properties",
  "pairs":[
    {"key":"text","optional":false,"rule":{"type":"string"}},
    {"key":"url","optional":false,"rule":{"type":"string"}},
    {"key":"src","optional":false,"rule":{"type":"string"}}
  ]
}
,
{
  "name":"actor-rule",
  "type":"and",
  "rules":[
    {"type":"array"},
    {"type":"content","rule":{"type":"ref","*":"link-rule"}}
  ]
}
,
{
  "name":"target-rule",
  "type":"and",
  "rules":[
    {"type":"array"},
    {"type":"content","rule":{"type":"ref","*":"link-rule"}}
  ]
}
,
{
  "name":"res-rule",
  "type":"and",
  "rules":[
    {"type":"array"},
    {"type":"properties",
      "pairs":[
       {"key":"key","optional":false,"rule":{"type":"string"}},
       {"key":"value","optional":false,"rule":{"type":"string"}}
      ]
    }
   ]
}
,
{
  "name":"prop-rule",
  "type":"and",
  "rules":[
    {"type":"array"},
    {"type":"content","rule":{
      "type":"or",
      "rules":[
        {"type":"ref","*":"link-rule"},
        {"type":"ref","*":"msg-rule"},
        {"type":"ref","*":"image-rule"}
      ]
}
,
{
  "name":"body-rule",
  "type":"properties",
  "pairs":[
    {"key":"actors","optional":false,"rule":{"type":"ref","*":"actor-rule"}},
    {"key":"targets","optional":false,"rule":{"type":"ref","*":"target-rule"}},
    {"key":"resources","optional":false,"rule":{"type":"ref","*":"res-rule"}},
    {"key":"props","optional":false,"rule":{"type":"ref","*":"prop-rule"}}
  ]
}
]
}

以下是验证的java代码:

public JSONObject getJsonSchema() {
    try {
            InputStream is = getClass().getResourceAsStream("/schema.json");
            JSONParser parser = new JSONParser(is);
            JSONValue value = parser.nextValue();
            JSONObject obj = (JSONObject)value;
            return obj;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
}

public static boolean validateJson(String json) {
        try {
            Reader reader = new StringReader(json);
            JSONParser parser = new JSONParser(reader);
            JSONValue value = parser.nextValue();
            JSONObject obj = getJsonSchema();
            JSONValidator validator = new JSONValidator(obj);
            validator.validate(value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

 :cry:  :cry:
推荐一个JSON格式化工具,JSON校验工具, JSON格式化  地址是  http://www.sojson.com
无广告加载快的工具

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Souleigh ✨ Souleigh ✨
2年前
前端性能优化 - 雅虎军规
无论是在工作中,还是在面试中,web前端性能的优化都是很重要的,那么我们进行优化需要从哪些方面入手呢?可以遵循雅虎的前端优化35条军规,这样对于优化有一个比较清晰的方向.35条军规1.尽量减少HTTP请求个数——须权衡2.使用CDN(内容分发网络)3.为文件头指定Expires或CacheControl,使内容具有缓存性。4.避免空的
Stella981 Stella981
2年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
35岁是技术人的天花板吗?
35岁是技术人的天花板吗?我非常不认同“35岁现象”,人类没有那么脆弱,人类的智力不会说是35岁之后就停止发展,更不是说35岁之后就没有机会了。马云35岁还在教书,任正非35岁还在工厂上班。为什么技术人员到35岁就应该退役了呢?所以35岁根本就不是一个问题,我今年已经37岁了,我发现我才刚刚找到自己的节奏,刚刚上路。
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这