joa*_*r84 5 reference file jsonschema
我想知道如何从其他文件中获取json模式.
假设我有两个文件,放在同一目录中:
文件1:person.json
{
"id":"#person",
"name": {"type":"string"},
"age": {"type":"number"},
"address": {
"type":"object",
"properties": {
"number": {"type":"number"},
"street": {"type":"string"},
"city": {"type":"string"}
}
}
}
Run Code Online (Sandbox Code Playgroud)
文件2:company.json
{
"id":"#company",
"name": {"type":"string"},
"employees": {
"type":"array",
"items" {"$ref":"person.json"}
}
}
Run Code Online (Sandbox Code Playgroud)
正如您可能观察到的那样,"员工"应该是一群"人".问题是我不知道如何引用"人"模式,因为它在不同的文件中.
我知道这可能是一个简单的问题,并且可能已经有了相关的答案,但我已经研究了很多,我不明白这是怎么做的.
编辑1
我使用Tiny Validator 4(tv4)进行模式验证.我也在使用QUnit测试模式是否正常运行.
下面,我将向您展示一个测试,其中地址编号是布尔值,它应该是类型编号.架构验证,何时不应该验证.
asyncTest("invalid type for adress number", function() {
expect(1);
var jsonObject = {
name: 'Computers Inc',
employees: [
{
name: 'John',
age: 29,
address: {
number: 9,
street: 'Oak Street',
city: 'London'
}
},
{
name: 'Mike',
age: 35,
address: {
number: true,
street: 'Big Avenue',
city: 'London'
}
}
]
};
// Gets the JSON Schema
$.getJSON('json_schemas/company.json', function(response) {
var jsonSchema = response;
console.log(jsonSchema);
// Verifies the validity of the JSON object
var valid = tv4.validate(jsonObject, jsonSchema);
ok(!valid, "Not valid because Mike's number is a boolean.");
start();
});
});
Run Code Online (Sandbox Code Playgroud)
看了一会儿之后,我认为是"$ .getJSON"搞砸了."console.log(jsonSchema)"表示获取的模式不包含person部分.获取的模式正是"company.json"文件中的模式.
编辑2
我认为它是这样的.:)
asyncTest("invalid type for address number", function() {
expect(1);
var jsonObject = {
name: 'Computers Inc',
employees: [
{
name: 'John',
age: 29,
address: {
number: 9,
street: 'Oak Street',
city: 'London'
}
},
{
name: 'Mike',
age: 35,
address: {
number: false,
street: 'Big Avenue',
city: 'London'
}
}
]
};
tv4.asyncValidate(jsonObject, 'json_schemas/company.json', function(valid) {
ok(!valid, printMessage(valid));
start();
});
});
Run Code Online (Sandbox Code Playgroud)
您的模式看起来应该可以工作 - 所以我的猜测是您没有正确地将模式加载到验证器中。
使用(您显然正在使用),您应该能够使用结果的属性tv4来查看是否缺少任何模式。"missing"
var result = tv4.validateMultiple(data, schema);
console.log(result.missing); // ['/json_schemas/missing-schema']
Run Code Online (Sandbox Code Playgroud)
要解决此问题,您需要在验证之前加载所需的任何模式tv4:
tv4.addSchema('/json_schemas/missing-schema', ...)
Run Code Online (Sandbox Code Playgroud)
还有一个示例脚本添加了一个tv4.asyncValidate(data, schema, callback)方法,该方法使用 jQuery 获取丢失的架构并重试,这可能对您有用。