技术心得:利用JsonSchema校验json数据内容的合规性

简介: 技术心得:利用JsonSchema校验json数据内容的合规性

背景:


复杂的AJAX应用程序可以与数百个不同的JSON服务进行交互,因此,引入对客户端验证的需求。


在处理校验问题方面有着很多的工具,但是通常可以将它们归为以下几类:


判断数据是否已被正确格式化


手动检查形式有误的数据并尝试纠正


手动检查形式有误的数据并将有误数据丢弃


自动检查形式有误的数据


在这里只讨论自动校验方面的可用工具包中的json schema,son schema项目首页:


JSON schema是一个帮助你定义、校验甚至是修复json数据格式的解决方案。它定义了一整套规则,允许我们通过定义一个schema(本身也是JSON)来描述一个JSON串的数据格式。它有如下优点:


描述你现有的JSON数据的格式;


清晰的、人类/机器可读的文档结构;


* 完全的结构校验,尤其适用于 自动测试 或 验证客户端提交的数据格式。


下面为一个定位信息的json schema例子


//json传输值


{


"data" : {


"id" : 851,


"detail" : "琴千线长征路-万盛南路附近",


"area" : 9480,


"province" : "浙江省",


"parentArea" : 2819,


"lng" : 120.32438,


"district" : "东阳市",


"lat" : 29.136176,


"city" : "金华"


}


}


//定位接口返回值的JSON schema


{


"type" : "object",


"properties" : {


"data" : {


"type" : "object",


"properties" : {


"id" : {


"type" : "integer",


"minimum": 0


},


"detail" : {


"type" : "string"


},


"area" : {


"type" : "integer"


},


"province" : {


"type" : "string",


"pattern" : "^(北京市|天津市|....|浙江省)$"


},


"parentArea" : {


"type" : "integer"


},


"lng" : {


"type" : "number",


"minimum" : 73,


"maximum" : 135


},


"district" : {


"type" : "string"


},


"lat" : {


"type" : "number",


"minimum" : 4,


"maximum" : 54


},


"city" : {


"type" : "string"


}


},


"required" : 【


"id",


"detail",


"area",


"province",


"parentArea",


"lng",


"district",


"lat",


"city"



}


},


"required" : 【


"data"



}


可以看出:


1、json schema 本身也是一个json串


2、每个schema可以描述一个json实例,并且该json实例里每一个节点都可以用一个schema来描述,因此schema与json一样,本身也是一个层级结构,一个schema中可能嵌套着另外若干层schema


3、json schema 定义的检查规则以数据格式验证为主(字段存在性、字段类型),并可以支持一些简单的数据正确性验证(例如数值范围、字符串的模式等),但不能进行复杂的逻辑校验(例如进价必须小于售价等)。


JS JSON Schema库


表1中简要概述了4个JSON Schema库的特性


表 1. 针对 JavaScript 的 JSON Schema 验证库


库(作者)草案版本支持库的大概规模


JSV: JSON Schema 验证器 (Gary Court)


draft-01、draft-02 和 draft-03


120KB


json-schema (Kris Zyp)


draft-03


10KB(需要 CommonJS)


dojox.json.schema (Kris Zyp)


draft-02


10KB(需要 Dojo)


schema.js (Andreas Kalsch)


draft-02(部分)


10KB(需要 CommonJS)


基于 Dojo 的应用程序可能会使用 dojox.json.schema 库,因为该库包含在工具箱中。支持多个版本的(草案)标准的应用程序可能会使用 JSV。


dojox.json.schema 看上去像是 json-schema 的一个分支,所以它们的用法非常相似。schema.js 只实现 draft-02 的一个子集。所以主要关注的是使用 dojox.json.schema 和 JSV 。


1. dojox.json.schema的使用


[/span>html

[/span>head

[/span>title

[/span>script src=""


type="text/javascript"

[/span>script type="text/javascript"

require(【"dojox/json/schema"】, function() {


// Object to validate


var successObj = {


"foo" : "bar"


};


var failureObj = {


"foo" : 1234


};


// Schema


var schema = {


"type": "object",


"properties" : {


"foo" : {


"type" : "string"


}


}


};


//var result = dojox.json.schema.validate(failureObj, schema);


var result = dojox.json.schema.validate(successObj, schema);


// Check results


if (result.valid) {


alert("Object is valid");


} else {


var errorArr = result.errors;


alert("property : " + errorArr【0】.property + "\nmessage : "


+ errorArr【0】.message);


}


});




[/span>body

Hello, World!




dojox.json.schema这种方法只需要引入一个js包,不过必须是线上的,将dojo那个js下载下来后就报错不能执行。


2. JSV的使用


[/span>head

[/span>title

//代码参考:https://weibo.com/u/7931797389


[/span>script src="js/uri.js" type="text/javascript"

[/span>script src="js/jsv.js" type="text/javascript"

[/span>script src="js/json-schema-draft-03.js" type="text/javascript"

[/span>script type="text/javascript"

// Object to validate


var successObj = {


"foo" : "bar"


};


var failureObj = {


"foo" : 1234


};


// Schema


var schema = {


"type": "object",


"properties" : {


"foo" : {


"type" : "string"


}


}


};


var env = JSV.createEnvironment("json-schema-draft-03");


// validate


var result = env.validate(successObj, schema);


if (result.errors.length === 0) {


alert("Object is valid");


} else {


var errorArr = result.errors;


alert("uri : " + errorArr【0】.uri + "\nmessage : "


+ errorArr【0】.message);


}




[/span>body

Hello, World!




JSV这种方法,需要导入3个js包,这是必须下载后才能使用。


JSV 在 errors 数组中提供了一些高级故障信息。每个错误可能包含以下属性:


message:人类可读的错误消息。


uri:失败对象所在位置的 URI。


schemaUri:引起故障的模式的所在位置的 URI。


Attribute:引起故障的模式约束。


* Details:包含更多详细信息的自由格式数组,比如预期值。


使用对比:


dojox.json.schema只需要引入一个js包,基于 Dojo 的应用程序可能会使用 dojox.json.schema 库,因为该库包含在工具箱中。校验的时候也只需要一行代码即可:var result = dojox.json.schema.validate(successObj, schema); 其中successObj为传入的JSON串,schema为校验规则。


JSV需要引入三个js包,JSV支持draft-01,draft-02,draft-03三种草案,支持多个版本的(草案)标准的应用程序可能会使用 JSV。校验的时候需要根据草案创建环境,然后再进行校验。var env = JSV.createEnvironment(“json-schema-draft-03”);


var result = env.validate(successObj, schema);


其中successObj为传入的JSON串,schema为校验规则。JSV在errors数组中提供了一些高级的故障信息,包括message:可读的错误信息;uri:失败对象所在位置的URI;schemaUri:引起故障的模式所在位置的URI;Attribute:引起故障的模式约束;Details:包含更多详细信息的自由格式数组,如果预期值。


性能对比:


一共执行50次,成功和失败分开执行,每种情况执行25次。然后记录下每次的执行时间,执行10次,取平均值。


dojox.json.schema:0.52, 4.28, 3.54, 4, 3.82, 3.64, 3.76, 4.12, 4.16, 5.6


JSV:4.5, 3.96, 3.88, 3.82, 3.98, 3.96, 3.9, 3.8, 4.1, 4.04


json schema类型每次执行时间(ms)


dojox.json.schema


3.744


JSV


3.994


发现时间相差不多,JSV由于js包在本地,所以每次时间比较稳定;dojox.json.schema由于需要从网络上去加载js包,导致执行时间有时会波动很大。整体来说,就执行过程,dojox.json.schema要快不少。


Java JSON Schema库


表2给出了两种java中使用的JSON Schema库


库名称地址支持草案


fge


draft-04 draft-03


everit


draft-04


建议:


如果在项目中使用了jackson json,那么使用fge是一个好的选择,因为fge就是使用的jackson json。


如果项目中使用的

相关文章
|
1天前
|
JSON Java Android开发
Android 开发者必备秘籍:轻松攻克 JSON 格式数据解析难题,让你的应用更出色!
【8月更文挑战第18天】在Android开发中,解析JSON数据至关重要。JSON以其简洁和易读成为首选的数据交换格式。开发者可通过多种途径解析JSON,如使用内置的`JSONObject`和`JSONArray`类直接操作数据,或借助Google提供的Gson库将JSON自动映射为Java对象。无论哪种方法,正确解析JSON都是实现高效应用的关键,能帮助开发者处理网络请求返回的数据,并将其展示给用户,从而提升应用的功能性和用户体验。
|
4天前
|
XML JSON Java
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
本文介绍了如何使用IntelliJ IDEA和Maven搭建一个整合了Struts2、Spring4、Hibernate4的J2EE项目,并配置了项目目录结构、web.xml、welcome.jsp以及多个JSP页面,用于刷新和学习传统的SSH框架。
14 0
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
|
16天前
|
JSON 前端开发 Java
Spring MVC返回JSON数据
综上所述,Spring MVC提供了灵活、强大的方式来支持返回JSON数据,从直接使用 `@ResponseBody`及 `@RestController`注解,到通过配置消息转换器和异常处理器,开发人员可以根据具体需求选择合适的实现方式。
41 4
|
4天前
|
JSON JavaScript 数据格式
Jquery 将 JSON 列表的 某个属性值,添加到数组中,并判断一个值,在不在数据中
Jquery 将 JSON 列表的 某个属性值,添加到数组中,并判断一个值,在不在数据中
14 0
|
21天前
|
JSON Java Serverless
函数计算产品使用问题之如何使用Go SDK从HTTP上下文中提取JSON数据
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
21天前
|
JSON Java fastjson
Spring Boot返回Json数据及数据封装
本文详细介绍了如何在Spring Boot项目中处理JSON数据的传输 Spring Boot默认使用Jackson作为JSON处理器,并通过`spring-boot-starter-web`依赖自动包含相关组件。文章还展示了如何配置Jackson处理null值,使其转换为空字符串。此外,文章比较了Jackson和FastJson的特点,并提供了FastJson的配置示例,展示了如何处理null值以适应不同应用场景。
|
1月前
|
JSON 分布式计算 大数据
MaxCompute产品使用合集之如何解析嵌套的JSON数据
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
1月前
|
JSON 文字识别 数据格式
文本,文识11,解析OCR结果,paddOCR返回的数据,接口返回的数据有code,data,OCR返回是JSON的数据,得到JSON数据先安装依赖,Base64转换工具网站在21.14
文本,文识11,解析OCR结果,paddOCR返回的数据,接口返回的数据有code,data,OCR返回是JSON的数据,得到JSON数据先安装依赖,Base64转换工具网站在21.14
文本,文识11,解析OCR结果,paddOCR返回的数据,接口返回的数据有code,data,OCR返回是JSON的数据,得到JSON数据先安装依赖,Base64转换工具网站在21.14
|
1月前
|
存储 JSON JavaScript
使用JSONObject解析与生成JSON数据
使用JSONObject解析与生成JSON数据
|
1月前
|
JSON 前端开发 JavaScript
Go怎么解析不定JSON数据?
在Go中处理不确定结构的JSON数据,可以使用`map[string]interface{}`来解析,它能适应各种JSON键值对,但需要类型检查。另一种方法是使用`json.RawMessage`保存原始JSON,之后按需解析。此外,`json.Number`用于处理任意精度的数字。当JSON字段类型未知时,可以先解码到`interface{}`并做类型断言。第三方库如gjson和jsonparser提供更灵活的解析选项。