Ověření JSON pomocí schématu JSON

Netrvalo dlouho a JSON se stal tou nejžhavější věcí od chvíle, kdy se Pam Andersonová pomalu odrážela po plážích BayWatch. A proč by nemělo být? JSON je snadno srozumitelný vizuálně, snadno se analyzuje na straně klienta i serveru a je podporován téměř ve všech jazycích kromě domorodců. Existuje však jeden problém, který vidím ve způsobu, jakým JSON dnes vývojáři používají:nedostatek ověření. Většina vývojářů předpokládá, že JSON je nejen bezchybný, ale také ve správném formátu. Špatný předpoklad. Dovolte mi ukázat vám, jak vám schéma JSON od Krise Zypa může pomoci ověřit JSON na straně klienta i serveru.

Co je schéma JSON?

Schéma JSON je standard (aktuálně ve fázi návrhu), který poskytuje koherentní schéma, podle kterého lze ověřovat „položku“ JSON. Vlastnosti v rámci schématu jsou definovány a s dalším objektem obsahujícím jejich očekávaný typ. Například:

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

Kromě poskytnutí požadovaného type , lze definovat další vlastnosti, včetně:

  • items :Mělo by se jednat o schéma nebo pole schémat. Pokud se jedná o objekt/schéma a hodnota instance je pole, všechny položky v poli musí tomuto schématu odpovídat.
  • optional :Poznamenává, zda má být vlastnost považována za volitelnou
  • requires :To znamená, že pokud je tato vlastnost přítomna v obsahujícím objektu instance, vlastnost daná atributem required musí být přítomna také v obsahujícím objektu instance.
  • maxItems :Definuje maximální počet položek v kolekci

K dispozici je řada dalších nemovitostí, které lze nalézt na adrese:http://tools.ietf.org/html/draft-zyp-json-schema-03

Definování jednoduchého schématu JSON

Řekněme, že naše aplikace vyžaduje data v následujícím formátu:

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

Ihned vidíme:

  • Objekt má vlastnost users
  • Vlastností users je pole
  • Pole users obsahuje objekty
  • Každý objekt má id (číslo), uživatelské jméno (řetězec), numPosts (číslo) a skutečné jméno (řetězec)

S ohledem na tuto strukturu můžeme vytvořit jednoduché schéma pro ověření našeho očekávaného formátu:

{
	"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 a schéma JSON – strana klienta

Rutina ověření schématu JSON je k dispozici s dojox.json.schema . validate metoda přijímá dva argumenty:váš JSON k ověření a schéma. Pojďme načíst schéma, které jsme vytvořili výše, spolu s ukázkovým JSON, který jsme vytvořili, a ověřte jej:

// 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);
				}
			});
		}
	});	
});

Skutečná valid vlastnost signalizuje, že JSON je platný. Pokud výsledek selže při ověření, valid bude false a errors vlastnost bude obsahovat řadu chybových zpráv s podrobnostmi o tom, proč daná vlastnost neprošla validací. Zde je ukázkový výsledek s chybami:

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

Jak s neplatnými údaji naložíte, je na vás; posun vpřed s neplatnými daty by mohl představovat bezpečnostní riziko pro vaši organizaci i uživatele.

CommonJS-Utils a schéma JSON – strana serveru

Kris také poskytuje rutinu ověřování JSON Schema na straně serveru v rámci svého projektu CommonJS Utils na GitHubu. Nainstaloval jsem tento projekt pomocí NPM pro NodeJS:

npm install commonjs-utils

V tomto balíčku je zdroj schématu json. Následující úryvek vyžaduje zdroje, načte schéma a datové soubory JSON a ověří datový JSON podle schématu:

// 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);
	});
});

Chcete-li to spustit pomocí příkazového řádku:

node server-validate.js

Strana serveru používá přesně stejné schéma a data jako strana klienta, takže vaše webová aplikace může být pokryta na obou frontách.

Závěrečné úvahy o schématu JSON

Schéma JSON je stále návrh, ale myslím si, že Kris odvedl vynikající práci při vytváření návrhů a kódovacích serverů a validátorů na straně klienta. Ověření JSON je často přehlíženo a data jsou nesprávně předpokládána jako správný. Zdroje pro ověřování dat jsou k dispozici – je na vás, zda je využijete!