Json.NET 模式是否忽略 $schema?
Does Json.NET Schema Ignore $schema?
JSON架构草案规范describes使用$schema
关键字“作为JSON架构版本标识符和本身就是一个资源的位置JSON 架构。”但是,当我尝试验证草案 v3 和 v4 支持时,我无法看到正在考虑的 $schema
值。例如,考虑下面的测试夹具。
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Schema;
using NUnit.Framework;
using System.Collections.Generic;
using System.IO;
namespace JsonSchemaExamples
{
[TestFixture]
public class ValidatorPlay
{
#region schema definitions
private const string myV4Schema = @"{
'$schema': 'http://json-schema.org/draft-04/schema#',
'type': 'object',
'properties':
{
'first_name': { 'type': 'string' },
'address':
{
'type': 'object',
'properties':
{
'street_address': { 'type': 'string' },
'state': { 'type': 'string' }
}
}
},
'required' : ['first_name']
}";
private const string myV3Schema = @"{
'$schema': 'http://json-schema.org/draft-03/schema#',
'type': 'object',
'properties':
{
'first_name':
{
'type': 'string',
'required': true
},
'address':
{
'type': 'object',
'properties':
{
'street_address': { 'type': 'string' },
'state': { 'type': 'string' }
}
}
}
}";
#endregion
#region json to validate
private JObject validPerson = JObject.Parse(@"{
'first_name' : 'Mark',
'age': 32,
'address' :
{
'street': '1 Main Street',
'postcode': 'AB12 0CD'
}
}");
private JObject invalidPerson = JObject.Parse(@"{
'Name' : 'Mark',
'age': 32,
'address' :
{
'street': '1 Main Street',
'postcode': 'AB12 0CD'
}
}");
#endregion
[TestCase(myV4Schema)]
[TestCase(myV3Schema)]
public void CheckDraftSupport(string schemaToUse)
{
JSchemaUrlResolver resolver = new JSchemaUrlResolver();
JSchema schema = JSchema.Parse(schemaToUse, resolver);
Assert.That(validPerson.IsValid(schema));
Assert.That(!invalidPerson.IsValid(schema));
}
}
}
如果我将 myV4Schema
中的 $schema
值更改为指向 v3,反之亦然 myV3Schema
我的两个测试都会继续通过。我本以为他们会失败并报告格式错误的架构(由于 required
属性)。
我误解了什么或者我做错了什么?
使用“$schema”验证模式是否符合规范将很快在未来的版本中实现。现在始终支持 V3 和 V4。
更新:
$schema 在 NuGet 的最新版本中使用。
JSON架构草案规范describes使用$schema
关键字“作为JSON架构版本标识符和本身就是一个资源的位置JSON 架构。”但是,当我尝试验证草案 v3 和 v4 支持时,我无法看到正在考虑的 $schema
值。例如,考虑下面的测试夹具。
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Schema;
using NUnit.Framework;
using System.Collections.Generic;
using System.IO;
namespace JsonSchemaExamples
{
[TestFixture]
public class ValidatorPlay
{
#region schema definitions
private const string myV4Schema = @"{
'$schema': 'http://json-schema.org/draft-04/schema#',
'type': 'object',
'properties':
{
'first_name': { 'type': 'string' },
'address':
{
'type': 'object',
'properties':
{
'street_address': { 'type': 'string' },
'state': { 'type': 'string' }
}
}
},
'required' : ['first_name']
}";
private const string myV3Schema = @"{
'$schema': 'http://json-schema.org/draft-03/schema#',
'type': 'object',
'properties':
{
'first_name':
{
'type': 'string',
'required': true
},
'address':
{
'type': 'object',
'properties':
{
'street_address': { 'type': 'string' },
'state': { 'type': 'string' }
}
}
}
}";
#endregion
#region json to validate
private JObject validPerson = JObject.Parse(@"{
'first_name' : 'Mark',
'age': 32,
'address' :
{
'street': '1 Main Street',
'postcode': 'AB12 0CD'
}
}");
private JObject invalidPerson = JObject.Parse(@"{
'Name' : 'Mark',
'age': 32,
'address' :
{
'street': '1 Main Street',
'postcode': 'AB12 0CD'
}
}");
#endregion
[TestCase(myV4Schema)]
[TestCase(myV3Schema)]
public void CheckDraftSupport(string schemaToUse)
{
JSchemaUrlResolver resolver = new JSchemaUrlResolver();
JSchema schema = JSchema.Parse(schemaToUse, resolver);
Assert.That(validPerson.IsValid(schema));
Assert.That(!invalidPerson.IsValid(schema));
}
}
}
如果我将 myV4Schema
中的 $schema
值更改为指向 v3,反之亦然 myV3Schema
我的两个测试都会继续通过。我本以为他们会失败并报告格式错误的架构(由于 required
属性)。
我误解了什么或者我做错了什么?
使用“$schema”验证模式是否符合规范将很快在未来的版本中实现。现在始终支持 V3 和 V4。
更新: $schema 在 NuGet 的最新版本中使用。