JSON Schema 简介

JSON Schema is a vocabulary that allows you to annotate and validate JSON documents.

JSON Schema官网

JSON Schema 是一个可以对json格式数据进行校验和进行内容描述的文档,它本身也是基于json格式的。

主要有以下作用:

  1. 对现有的json数据格式进行描述(字段类型、内容长度、是否必须存在、取值示例等);
  2. 是一个描述清晰、人机可读的文档;
  3. 自动测试、验证客户端提交的数据;

JSON Schema 简单示例

我们把需要被验证的json文档称为instance,用来校验它的文档就是schema;

一个最基础的schema就是一个空的json对象 {} ,对instance不做任何限制,没有任何描述。下面是一个简单的instance和schema示例:

需要被校验的instance:

{
  "foo": 32,
  "bar": "Must equal this value"
}

schema:

{
  "type": "object",
  "properties": {
    "foo": {
      "type": "number"
    },
    "bar": {
      "const": "Must equal this value"
    }
  }
}

其中关键字“type”可以用来对instance的类型进行限制,它可以取如下几个值 object, array, string, number, boolean, null。

关键字“const”要求被验证的数据与其所定义的内容保持一致。

JSON Schema 在线工具

根据JSON数据和对应的JSON Schema校验数据:

http://json-schema-validator.herokuapp.com/

https://jsonschemalint.com/

根据JSON数据在线生成JSON Schema:

https://jsonschema.net/

JSON Schema第三方工具

JSON Schema已经有多种语言实现的第三方工具可以使用,详见官网说明:http://json-schema.org/implementations。下面3个是java的相关实现:

json-schema-validator supports draft 4 includes draft-04 hype-schema syntax support (LGPLv3)

json-schema (implementation based on the org.json API) supports draft 4, draft 6 (Apache License 2.0)

json-schema-validator supports draft 4 (Apache License 2.0)

使用第三方工具json-schema-validator

下面使用上述3个工具中的第一个,实现用schema验证json数据的功能:

1.首先在pom里,添加如下配置:

                <!-- fge -->
        <dependency>
            <groupId>com.github.fge</groupId>
            <artifactId>json-schema-validator</artifactId>
            <version>2.2.6</version>
        </dependency>
        <!-- fasterxml -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.8.8</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.8</version>
        </dependency>

2.编写工具类JsonSchemaValidator.java

public class JsonSchemaValidator {
    public static Map<String, Object> validateJsonByFgeByJsonNode(JsonNode jsonNode, JsonNode schemaNode) {
        Map<String, Object> result = new HashMap<String, Object>();
        ProcessingReport report = null;
        report = JsonSchemaFactory.byDefault().getValidator().validateUnchecked(schemaNode, jsonNode);
        if (report.isSuccess()) {
            // 校验成功
            result.put("message", "校验成功!");
            result.put("success", true);
            return result;
        } else {
            System.out.println("校验失败!");
            Iterator<ProcessingMessage> it = report.iterator();
            String ms = "";
            while (it.hasNext()) {
                ProcessingMessage pm = it.next();
                if (!LogLevel.WARNING.equals(pm.getLogLevel())) {
                    ms += pm;
                }

            }
            result.put("message", "校验失败!" + ms);
            result.put("success", false);
            return result;
        }
    }

    public static JsonNode getJsonNodeFromString(String jsonStr) {
        JsonNode jsonNode = null;
        try {
            jsonNode = JsonLoader.fromString(jsonStr);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return jsonNode;
    }

    public static JsonNode getJsonNodeFromFile(String filePath) {
        JsonNode jsonNode = null;
        try {
            jsonNode = new JsonNodeReader().fromReader(new FileReader(filePath));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return jsonNode;
    }

}

3.接收页面数据、读取文件数据的JsonSchemaController

@RestController
public class JsonSchemaController {

    @Value("${upload.rootPath}")
    private String rootPath;

    @RequestMapping(value = "/json-schema/validate", method = RequestMethod.GET)
    public Map<String, Object> jsonSchemaValidate(String jsonStr) {
        Map<String, Object> result = new HashMap<String, Object>();

        JsonNode jsonNode = JsonSchemaValidator.getJsonNodeFromString(jsonStr);
        if (jsonNode == null) {
            result.put("success", false);
            result.put("message", "json报文格式错误");
            return result;
        }

        String filePath =  rootPath + "/json-file/json_schema_test.json";
        JsonNode schemaNode = JsonSchemaValidator.getJsonNodeFromFile(filePath);
        if (schemaNode == null) {
            result.put("success", false);
            result.put("message", "json Schema文件不存在,无法校验!");
            return result;
        }
        return JsonSchemaValidator.validateJsonByFgeByJsonNode(jsonNode, schemaNode);
    }

}

3.前端页面json_schema.html

<body class=" ">
    <div>
        <textarea class=" " name="parameterContentLeft" id="parameterContentLeft" placeholder="请输入请求报文内容"></textarea>
    </div>
    <br>
    <button onclick="setAjaxRequest();" id="doJson" class=" ">发送</button>
    <div class=" ">
        <pre id="responsePre">

        </pre>
    </div>
    <script src="frame/jquery.min.js"></script>
    <script>
        function setAjaxRequest() {
            $.ajax({
                url : "/json-schema/validate",
                type : "GET",
                data : {
                    jsonStr : $("#parameterContentLeft").val()
                },
                async : false
            }).done(function(data) {
                $("#responsePre").html(data.message);
            });
        }
    </script>
</body>

测试功能

下面使用上面提到的在线生成scheme的工具里提供的样例,测试下我们刚才编写的代码:

instance:

{
  "checked": false,
  "dimensions": {
    "width": 5,
    "height": 10
  },
  "id": 1,
  "name": "A green door",
  "price": 12.5,
  "tags": [
    "home",
    "green"
  ]

schema过长,就不贴了,详见这里

在页面进行测试,效果如下:

把 "width": 5 改为 "width": 5.5,测试效果:

在2个在线测试工具上测试效果:



可以看到2个在线测试工具,一个输出了错误信息和警告信息,另一个只输出了错误信息。而我们本地开发的工具只输出了错误信息,是我把警告过滤掉了,这个可以根据实际需求进行修改;

JSON Schema 校验实例的更多相关文章

  1. json schema校验

    工作中使用到了json schema格式校验的问题,在网上查了些资料,结合自己的理解记录一下. json schema可以对json结果字符串做出一些约束,例如: 1. 值类型是:array, obj ...

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

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

  3. Json schema 以及在python中的jsonschema

    目录 1. JSON Schema简介 2. JSON Schema关键字详解 2.1 $schema 2.2 title和description 2.3 type 3 type常见取值 3.1 当t ...

  4. Json.Net使用JSON Schema验证JSON格式【实例】

    给出一个Json,验证其格式是否符合规则. { "coord": { //对象 "lon": 145.77, "lat": -16.92 } ...

  5. Understanding JSON Schema

    json schema 在线校验器 译自:Understanding JSON Schema { "type": "object", "propert ...

  6. Json Schema的使用

    直接上案例: 在Web Api通讯中,客户端发送json数据,服务端反序列化json(json与某个类形成对应关系),在某些情况下,需要校验其上传的json是否合法. 服务端是使用Json.net(n ...

  7. Json Schema简介

    1. 引言 什么是Json Schema? 以一个例子来说明 假设有一个web api,接受一个json请求,返回某个用户在某个城市关系最近的若干个好友.一个请求的例子如下: { "city ...

  8. rest-assured之Schema validation(包括JSON Schema validation及Xml Schema validation)

    rest-assured从2.1.0版本开始支持  Schema 验证,包括JSON Schema validation及Xml Schema validation.我们之前断言响应体都是一个一个字段 ...

  9. 怎样用Google APIs和Google的应用系统进行集成(5)----怎样把Google Tasks的JSON Schema转换成XML的Schema(XSD)?

    前面说了一些Google API的介绍,可是在实际的开发其中,我们可能须要把Google RESTful API返回的JSON数据转换成XML数据输入到第三方系统,这在企业应用集成里面很的常见. 那么 ...

随机推荐

  1. javascript第二章--变量、作用域和内存问题

    ① 基本类型和引用类型的值 ② 执行环境及作用域 ③ 垃圾收集

  2. 【S2-052】漏洞复现(CVE-2017-9805)

    一.漏洞描述 Struts2 的REST插件,如果带有XStream组件,那么在进行反序列化XML请求时,存在未对数据内容进行有效验证的安全隐患,可能发生远程命令执行. 二.受影响版本 Struts2 ...

  3. SpringBoot之简单日志配置

    我的目的指定一个文件夹输出:(不采用指定文件的原因是一个文件的大小时间长了会很大,不利于处理) logging: level: root: INFO org.sselab: controller: I ...

  4. JavaWeb面试(六)

    51.说一说Servlet的生命周期? Servlet有良好的生存期的定义,包括加载和实例化.初始化.处理请求以及服务结束.这个生存期由javax.servlet.Servlet接口的init(),s ...

  5. 初学者没有搞明白的GOROOT,GOPATH,GOBIN,project目录

    我们接下来一个一个来看关于Go语言中的三个目录的详细解释先通过go env查看go的环境变量(我这里是mac的环境,所以可能和你的不同) localhost:~ zhaofan$ go env GOA ...

  6. Python基础学习-'module' object has no attribute 'urlopen'解决方法

    import numpy as npimport urlliburl = "http://archive.ics.uci.edu/ml/machine-learning-databases/ ...

  7. [flask实践] 解决mysql数据库不支持中文的问题

    接上一篇文章,在解决了mysql+flask环境配置问题之后,往数据库存中文字符串会报1366错误,提示不正确的字符.继而发现默认的mysql采用了Latin1字符集,这种编码是不支持中文的. 如果想 ...

  8. km算法入门

    本文知识均由笔者自学,文章有错误之处请不吝指出. 笔者刷数模题的时候有一道题考到了"二分图最大权分配",需要用到KM算法,但是书上对KM算法的介绍又臭又长,更何况有些同学" ...

  9. Java(概略篇)

    准备 下载并安装Java jdk 和 编辑器(eclipse或Netbeans) 配置环境变量 第一个程序 public class test{ public static void main(Str ...

  10. 手动安装lump

    教你编译PHP7 (nginx+mysql+php7)  PHP7正式版已经发布,性能是PHP5.6的两倍! 操作系统: CentOS Linux, 6.5 64位服务器: 阿里云空的操作系统,我们从 ...