使用JSON Schema来验证接口数据

本文作者:IMWeb zzbozheng 原文出处:IMWeb社区 未经同意,禁止转载

最近在做一些关于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 条评论
登录 后参与评论

相关文章

来自专栏Rust语言学习交流

【Rust日报】 2019-11-12 揭开异步Rust的神秘面纱

经过大量的重构之后,librsvg现在可以在Rust中完成所有CSS解析和匹配,无需使用libcroco。另外,CSS引擎来自Mozilla Servo,因此它...

10630
来自专栏前端迷

数组原生api以及es6+函数式编程(curry)实现lodash函数

本文实现方法都是看效果倒推实现方法,并进行一些拓展和思考,和源码无关。lodash这个库的文档更像一个题库,给出了题目让我们刷题的

5110
来自专栏java工会

Caffeine Cache 进程缓存之王

互联网软件神速发展,用户的体验度是判断一个软件好坏的重要原因,所以缓存就是必不可少的一个神器。在多线程高并发场景中往往是离不开cache的,需要根据不同的应用场...

7820
来自专栏京程一灯

JavaScript 测试教程 part 1:用 Jest 进行单元测试[每日前端夜话0xE7]

有多种不同种类的测试,我会首先解释其中的一部分。首先,我将介绍单元测试的基础知识,即测试应用程序的每个部分并检查它们是否适合使用。为此我们将使用 Faceboo...

8920
来自专栏全栈修仙之路

在前端 Word 还能这样玩

前阵子听到公司运营的小姐姐们在抱怨,说在富文本编辑器中发布包含图片的 Word 文档时,图片和文本内容不能一起复制,每次她们都得分开处理,对于包含较多图片的 W...

13630
来自专栏Creator星球游戏开发社区

我应该拿什么来拯救你,我的游戏?

前段时间,晓衡加入的一个小游戏个人开发者群突然,炸锅了!群里有两位伙伴开发的小游戏,一个破解上架头条,一个破解打成 Android 包。

13720
来自专栏Hadoop实操

0729-6.3.0-如何修改CDSW1.6中Docker服务的默认网关

CDSW服务Docker组件启动时自动创建docker0网桥,其默认IP为172.17.0.1。该网段的网关与公司的网关冲突,导致服务器上挂载的公共盘不能正常使...

6920
来自专栏Rust语言学习交流

async-std 1.0发布

async-std是Rust的标准库到异步世界的移植。它运行速度十分快,使用体验也更良好。

10720
来自专栏前端自习课

【JS】409- ES6之Proxy 的巧用

使用Proxy,你可以将一只猫伪装成一只老虎。下面大约有6个例子,我希望它们能让你相信,Proxy 提供了强大的 Javascript 元编程。

7920
来自专栏全栈前端精选

Vue + Koa从零打造一个H5页面可视化编辑器——Quark-h5

想必你一定使用过易企秀或百度H5等微场景生成工具制作过炫酷的h5页面,除了感叹其神奇之处有没有想过其实现方式呢?本文从零开始实现一个H5编辑器项目完整设计思路和...

26930

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励