使用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 条评论
登录 后参与评论

相关文章

来自专栏扎心了老铁

python使用上下文管理器实现sqlite3事务机制

如题,本文记录如何使用python上下文管理器的方式管理sqlite3的句柄创建和释放以及事务机制。 1、python上下文管理(with) python上下文...

48812
来自专栏北京马哥教育

Python如何防止sql注入

豌豆贴心提醒,本文阅读时间10分钟 前言 web漏洞之首莫过于sql了,不管使用哪种语言进行web后端开发,只要使用了关系型数据库,可能都会遇到sql注入攻...

5436
来自专栏海天一树

小朋友学Python(7):输入与输出

一、print与input print "a =", a = input() print "b =" b = input() print "c =", c = ...

29910
来自专栏余林丰

虚拟机类加载机制(2)——类加载器

《深入理解Java虚拟机》一书中将类的加载过程放到了类加载器前面一节,但在这里我想先讲“类加载器”。在上一篇类加载时机中我们用大量篇幅来讲解了类加载过程中的5个...

2166
来自专栏Python小屋

一行Python代码统计词频

问题描述:给定一段文本,统计其中每个单词的出现频率。 技术要点:扩展库jieba的cut()函数,标准库collections中的Counter类。 参考代码:...

5063
来自专栏海天一树

小朋友学Python(16):模块

一、模块的定义 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。 模块让你能...

2654
来自专栏开发与安全

X86 寻址方式、AT&T 汇编语言相关知识、AT&T 与 Intel 汇编语言的比较、gcc 嵌入式汇编

注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了...

4580
来自专栏Java帮帮-微信公众号-技术文章全总结

hibernate延迟加载详解

hibernate延迟加载详解 Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默认会被延迟加载,实体所关联的实体默认也会被延迟加载。hiber...

3183
来自专栏ImportSource

并发编程-用锁来保护状态

由于锁机制可以让他保护起来的代码片段始终被串行访问。也就是一个访问完了,再由下一个来访问。我们可以利用锁的这种特点,来约定一些协议,来对共享的状态进行独占访问。...

3425
来自专栏hbbliyong

你真的了解如何将 Nginx 配置为Web服务器吗

阅读之前,建议先阅读初识 Nginx。 之后,我们来了解一下 Nginx 配置。 抽象来说,将 Nginx 配置为 Web 服务器就是定义处理哪些 URLS 和...

6147

扫码关注云+社区

领取腾讯云代金券