zoukankan      html  css  js  c++  java
  • 使用JSON Schema来验证接口数据

    最近在做一些关于JSON Schema的基建,JSON Schema可以描述一个JSON结构,那么反过来他也可以来验证一个JSON是否符合期望的格式。

    如果之前看我写的《使用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 规范

  • 相关阅读:
    LeetCode 127. Word Ladder 单词接龙(C++/Java)
    LeetCode 681. Next Closest Time 最近时刻 / LintCode 862. 下一个最近的时间 (C++/Java)
    LeetCode 682. Baseball Game 棒球比赛(C++/Java)
    LeetCode 218. The Skyline Problem 天际线问题(C++/Java)
    小数据池,编码
    字典
    列表
    常见的数据类型
    while循环
    初始python
  • 原文地址:https://www.cnblogs.com/zzbo/p/5906105.html
Copyright © 2011-2022 走看看