这是当JSON.net试图读取我的JSON模式(return JsonSchema.Read(new JsonTextReader(reader));
)时我得到的错误:
2014-07-15 15:33:42.7011 [Fatal] Newtonsoft.Json.JsonException: Could not resolve schema reference 'data-result.json'.
at Newtonsoft.Json.Schema.JsonSchemaBuilder.ResolveReferences(JsonSchema schema) in c:DevelopmentReleasesJsonWork
ingNewtonsoft.JsonSrcNewtonsoft.JsonSchemaJsonSchemaBuilder.cs:line 139
at Newtonsoft.Json.Schema.JsonSchemaBuilder.ResolveReferences(JsonSchema schema) in c:DevelopmentReleasesJsonWork
ingNewtonsoft.JsonSrcNewtonsoft.JsonSchemaJsonSchemaBuilder.cs:line 179
at Newtonsoft.Json.Schema.JsonSchemaBuilder.Read(JsonReader reader) in c:DevelopmentReleasesJsonWorkingNewtonsof
t.JsonSrcNewtonsoft.JsonSchemaJsonSchemaBuilder.cs:line 85
at Newtonsoft.Json.Schema.JsonSchema.Read(JsonReader reader, JsonSchemaResolver resolver) in c:DevelopmentReleases
JsonWorkingNewtonsoft.JsonSrcNewtonsoft.JsonSchemaJsonSchema.cs:line 280
at Newtonsoft.Json.Schema.JsonSchema.Read(JsonReader reader) in c:DevelopmentReleasesJsonWorkingNewtonsoft.Json
SrcNewtonsoft.JsonSchemaJsonSchema.cs:line 266
at ThinkBinary.SchemaToPoco.Core.JsonSchemaToCodeUnit.LoadSchema(String file) in c:UsersSLiuProjectsjson-schema-t
o-pocoSourceThinkBinary.SchemaToPoco.CoreJsonSchemaToCodeUnit.cs:line 70
at ThinkBinary.SchemaToPoco.Core.JsonSchemaToCodeUnit..ctor(String schemaDocument, String requestedNamespace) in c:U
sersSLiuProjectsjson-schema-to-pocoSourceThinkBinary.SchemaToPoco.CoreJsonSchemaToCodeUnit.cs:line 19
at ThinkBinary.SchemaToPoco.Console.Program.Main(String[] args) in c:UsersSLiuProjectsjson-schema-to-pocoSource
ThinkBinary.SchemaToPoco.ConsoleProgram.cs:line 38
My JSON schema:
{
"$schema": "http://json-schema.org/draft-03/schema#",
"title": "DataSet",
"description": "A result set and description of measures and values",
"type": "object",
"properties": {
"results": {
"$ref": "data-result.json"
},
"dimensions": {
"type": "array",
"description": "An array of data dimensions included in a result set",
"items": {
"$ref": "data-dimension.json"
},
"uniqueItems": true
},
"measure": {
"$ref": "data-measure.json",
"description": "single measure represented in this data set."
}
},
}
我的问题是,我有这个JSON模式与这个外部文件的引用,data-result.json
,但JSON.net还不知道它的存在。有什么办法可以解决这个问题吗?我的一个想法是浏览模式,如果有任何对外部文件的引用,用共同的JsonSchemaResolver
来解析那些。我必须添加适当的ID,因为看起来$ref
喜欢通过ID匹配,尽管在jsonschema.org上,有$ref
与文件名一起使用的明显示例。我想知道是否有更好的方式,JSON.net原生支持引用外部模式。
源代码托管在Github上,如果它有帮助的话。我已经测试了$ref
字段删除,它编译成功。
Json。. NET Schema对解析外部引用的支持有了很大的改进。
阅读更多:http://www.newtonsoft.com/jsonschema/help/html/LoadingSchemas.htm
我的一个想法是浏览模式,如果有任何对外部文件的引用,用通用的
解析那些JsonSchemaResolver
是的,您需要知道您的模式依赖于哪些模式,首先解析这些模式并将它们添加到JsonSchemaResolver
中。模式将使用它们的id进行解析。
下面是一个例子(使用draft-03语法):
var baseSchema = JsonSchema.Parse(@"
{
""$schema"": ""http://json-schema.org/draft-03/schema#"",
""id"": ""http://mycompany/base-schema#"",
""type"": ""object"",
""properties"": {
""firstName"": { ""type"": ""string"", ""required"": true}
}
}
");
var resolver = new JsonSchemaResolver
{
LoadedSchemas = {baseSchema}
};
var derivedSchema = JsonSchema.Parse(@"
{
""$schema"": ""http://json-schema.org/draft-03/schema#"",
""id"": ""http://mycompany/derived-schema#"",
""type"": ""object"",
""extends"":{ ""$ref"": ""http://mycompany/base-schema#""},
""properties"": {
""lastName"": { ""type"": ""string"", ""required"": true}
}
}
", resolver);
小提琴:https://dotnetfiddle.net/g1nFew
我认为问题可能是您在那些$ref
项中有相对的URI,但没有id
属性来建立基本URI。您可以通过在最外层的上下文中添加id="<absolute-url>"
来解决问题,从而建立可以从中检索这些外部文件的位置。
参见http://json-schema.org/latest/json-schema-core.html
第7节注:在measure
项目中,我注意到您同时具有$ref
和description
值。JSON - Reference网络草案说 JSON引用对象中除"$ref"之外的任何成员都将被忽略。