欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用JSON模式进行JSON验证

程序员文章站 2022-07-12 15:11:15
...

使用JSON模式进行JSON验证

自帕姆·安德森(Pam Anderson)慢慢在BayWatch海滩沿途反弹以来,JSON很快就成为最热门的东西。 为什么不呢? JSON易于视觉理解,易于在客户端和服务器端进行解析,并且除土著语言外,几乎所有语言都支持JSON。 但是,如今开发人员使用JSON的方式存在一个问题:缺乏验证。 大多数开发人员认为JSON提供的不仅正确而且格式正确。 错误的假设。 让我向您展示Kris Zyp的 JSON模式如何帮助您在客户端和服务器端验证JSON。

什么是JSON模式?

JSON Schema是一个标准(当前处于草稿中),提供了用于验证JSON“项目”所依据的一致模式。 定义了架构内的属性,并使用另一个包含其预期类型的​​对象。 例如:

"myObj" : {
	"type" : "array",
	"properties" : {
		"id": { "type": "number" },
		"username": { "type" : "string" }
	}
}

除了提供所需的type ,还可以定义其他属性,包括:

  • items :这应该是一个模式或模式数组。 如果这是一个对象/模式,并且实例值是一个数组,则该数组中的所有项目都必须符合此架构。
  • optional :注释该属性是否应视为可选
  • requires :这表示如果包含实例对象中存在此属性,则require属性指定的属性也必须存在于包含实例对象中。
  • maxItems :定义集合中的最大项目数

还有许多其他属性,可以在以下位置找到所有这些属性: http : //tools.ietf.org/html/draft-zyp-json-schema-03

定义一个简单的JSON模式

假设我们的应用程序需要以下格式的数据:

{
	users: [
		{ id: 1, username: "davidwalsh", numPosts: 404, realName: "David Walsh" },
		{ id: 2, username: "russianprince", numPosts: 12, realName: "Andrei Arshavin" }
	]
}

马上我们可以看到:

  • 该对象具有用户属性
  • users属性是一个数组
  • users数组包含对象
  • 每个对象都有一个id(数字),用户名(字符串),numPosts(数字)和realName(字符串)

考虑到这种结构,我们可以创建一个简单的架构来验证我们期望的格式:

{
	"type" : "object",
	"properties" : {
		"users" : {
			"type" : "array", // remember that arrays are objects
			"items" : { // "items" represents the items within the "users" array
				"type" : "object",
				"properties" : {
					"id": { "type": "number" },
					"username": { "type" : "string" },
					"numPosts": { "type" : "number" },
					"realName": { "type" : "string", optional: true }
				}
			}
		}
	}
}

dojox.json.schema和JSON架构-客户端

dojox.json.schema提供了JSON Schema验证例程。 validate方法接受两个参数:要验证的JSON和模式。 让我们加载上面创建的模式以及我们创建的样本JSON,并对其进行验证:

// Require the json scheme module
dojo.require("dojox.json.schema");

// When resources are ready
dojo.ready(function() {

	// Load the schema
	dojo.xhrGet({
		url: 'schema.json',
		handleAs: 'json',
		load: function(schema) {

			// Now load the JSON
			dojo.xhrGet({
				url: 'users.json',
				handleAs: 'json',
				load: function(users) {

					// Now validate it!
					var result = dojox.json.schema.validate(users,schema);

					// Show the result
					console.log(result);
				}
			});
		}
	});	
});

正确的valid属性表示JSON有效。 如果结果未通过验证,则valid将为false,并且errors属性将包含一系列错误消息,详细说明给定属性未通过验证的原因。 这是带有错误的示例返回结果:

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

您如何处理无效数据取决于您自己; 继续使用无效数据可能会给您的组织和用户带来安全风险。

CommonJS-Utils和JSON架构-服务器端

Kris还在GitHub上的CommonJS Utils项目中提供了服务器端JSON Schema验证例程。 我已经使用NPM for NodeJS安装了该项目:

npm install commonjs-utils

这个包中有一个json模式资源。 以下代码片段需要资源,读取模式和数据JSON文件,并根据模式验证数据JSON:

// Require Sys and FileSystem
var sys = require('sys'), fs = require('fs');

// Require package
var validate = require('commonjs-utils/json-schema').validate;

// Load a schema by which to validate
fs.readFile('schema.json',function(err,data) {
	if(err) throw err;
	var schema = data;
	// Load data file
	fs.readFile('./users.json',function(err,data) {
		if(err) throw err;
		// Parse as JSON
		var posts = JSON.parse(data);
		// Validate
		var validation = validate(posts, schema);
		// Echo to command line
		sys.puts('The result of the validation:  ',validation.valid);
	});
});

要通过命令行运行此命令:

node server-validate.js

服务器端使用与客户端完全相同的架构和数据,因此您的Web应用程序可以同时涵盖这两个方面。

关于JSON模式的总结思想

JSON Schema仍然是草案,但我认为Kris在创建草案以及对服务器和客户端验证器进行编码方面做得非常出色。 JSON验证通常被忽略,并且错误地将数据假定为正确的。 数据验证的资源可用-由您决定使用它们!

翻译自: https://davidwalsh.name/json-validation