如何使用JSON.net引用外部文件



这是当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项目中,我注意到您同时具有$refdescription值。JSON - Reference网络草案说 JSON引用对象中除"$ref"之外的任何成员都将被忽略。

这可能没有任何害处,但如果有人期望该值覆盖外部文件中的描述,则可能会令人惊讶。

相关内容

  • 没有找到相关文章