使用JSON Schema来验证接口数据

最近在做一些关于JSON Schema的基建,JSON Schema可以描述一个JSON结构,那么反过来他也可以来验证一个JSON是否符合期望的格式,于是我想到之前lqlong 之前的一篇 《数据字段防卫探索》 发现JSON Schema可以做这个事情。

如果之前看我写的《使用joi来验证数据模型》 可能会问,为什么不使用JOI,反而使用JSON Schema?因为JOI这个nodejs库,除了验证格式,还带有验证字段关系的功能,库体积相对庞大,而且对于含有嵌套格式的JSON,用JOI来编写验证配置,极为繁琐。JSON Schema清晰简读,用来验证接口数据非常合适。

假设我们有一个期望JSON:

{
    users: [
        { id: 1, username: "zzbo", }
    ]
}

我们理解这个JSON结构如下:

  • 这个JSON对象有一个users的属性
  • 这个user属性是一个数组
  • 这个数组里面的元素是一个对象
  • 每一个对象里面包含了两个字段:id(Number),username(String)

用JSON Schema来描述这个JSON的结构

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type" : "object",
    "properties" : {
        "users" : {
            "type" : "array",
            "items" : {
                "type" : "object",
                "properties" : {
                    "id": { "type": "number" },
                    "username": { "type" : "string" }
                }
            }
        }
    }
}

描述一个JSON就是这么简单。

如果还嫌编写Shema麻烦,哪位高手来写一个根据JSON自动生成JSON Schema的工具。

DOJO已提供了JSON Schema来验证接口数据的功能:

dojo其实早已经这样干,我们可以借鉴。

// 引入dojo的json schema验证模块
dojo.require("dojox.json.schema");

dojo.ready(function() {
    // 加载指定的schema
    dojo.xhrGet({
        url: 'schema.json',
        handleAs: 'json',
        load: function(schema) {

            // 拉取数据
            dojo.xhrGet({
                url: 'users.json',
                handleAs: 'json',
                load: function(users) {
                    // 使用 dojo 的 json schema验证模块来验证
                    var result = dojox.json.schema.validate(users, schema);
                    console.log(result); 
                }
            });
        }
    });    
});

如果验证合法则返回true, 否则他会返回一个错误信息:

{
    errors: [
        {
            message: "is missing and not optional",
            property: "users"
        }
    ]
    valid: false
}

然而,我们往往会担心数据的某个字段缺失,或者类型不是我们所期望的,然后程序中又疏忽于这些判断。如果我们要打造一个像dojo这样的json schema验证工具,除了validate功能,最好还会有一个fill功能,用于自动填充缺失的字段。

相关资料

JSON Schema 规范

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端知识分享

Vue---自定义组件

       组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码。在较高层面上,组件是自定义元素,...

322
来自专栏Samego开发资源

试探input.type是否为空 | JavaScript

2145
来自专栏PHP技术大全

通过代码审计找出网站中的XSS漏洞实战(三)

笔者此前录制了一套XSS的视频教程,在漏洞案例一节中讲解手工挖掘、工具挖掘、代码审计三部分内容,准备将内容用文章的形式再次写一此,前两篇已经写完,内容有一些关联...

892
来自专栏计算机编程

Vue 单文件组件详解<1>--简单上手

vue 的webpack的结构非常简单,简单的一眼就可以知道每个目录下是干啥的,在components目录下就有属于我们想要详细解析的内容,这两个vue文件即为...

581
来自专栏python3

python导入模块--import--1

    python前面写的程序,后面就可以将它当成一个模块导入,取其精华舍弃不用的随意使用,最理想的情况是任何一个功能,只要写一次,以后所有人都可以任意调用,...

602
来自专栏Java学习123

plsql导出表结构语句

2688
来自专栏大内老A

难道.NET Core到R2连中文编码都不支持吗?

今天写了一个简单的.NET Core RC2控制台程序,发现中文显示一直是乱码。查看操作系统设置,没有问题;查看源文件编码,也没有问题;甚至查看了Console...

1716
来自专栏木头编程 - moTzxx

小程序 动态修改二维数组 示例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

511
来自专栏PHP技术

jQuery formValidator表单验证插件

jQuery formValidator表单验证插件是客户端表单验证插件。 Query formValidator表单校验插件支持的验证功能(还有很多功能没有罗...

3869
来自专栏技术之路

silverlight 双击事件

silverlight的一些功能真让我感到惊奇 就拿双击事件来说一下 写一个简单的例子 <StackPanel x:Name="st_De" MouseLeft...

1758

扫码关注云+社区