【问题标题】:How to get a JSON.NET JSchema generator to render the additionalProperties attribute in a JSON schema如何让 JSON.NET JSchema 生成器在 JSON 模式中呈现附加属性属性
【发布时间】:2018-05-23 23:35:02
【问题描述】:

我正在使用 JSON.NET JSchema Generator 来创建基于用数据注释属性修饰的类的模式。我正在使用这样的生成器:

var generator = new JSchemaGenerator();
generator.ContractResolver = new CamelCasePropertyNamesContractResolver();
generator.SchemaIdGenerationHandling = SchemaIdGenerationHandling.TypeName;
var schema = generator.Generate(typeof(myType));
string jsonSchema = schema.ToString();

这会生成一个示例架构,例如:

{
     "$id": "myType",
     "definitions": {
          "mySubType" : {
              "$id": "mySubType",
              "type": [
                   "object",
                   "null"
              ],
              "properties": {
                  "name": {
                     "type: "string"
                  }
              },
              "required": [
                  "name"
              ]
          }
     },
     "type": "object",
     "properties": {
         "name": {
            "type": "string"
         },
         "details": {
            "$ref": "mySubType"
         }
      },
      "required": [
          "name",
          "details"
      ]
}

希望能够生成包含myTypemySubType 的附加属性属性的架构,如下所示:

{
     "$id": "myType",
     "definitions": {
          "mySubType" : {
              "$id": "mySubType",
              "type": [
                   "object",
                   "null"
              ],
              "properties": {
                  "name": {
                     "type: "string"
                  }
              },
              "required": [
                  "name"
              ],
              "additionalProperties": false
          }
     },
     "type": "object",
     "properties": {
         "name": {
            "type": "string"
         },
         "details": {
            "$ref": "mySubClass"
         }
      },
      "required": [
          "name",
          "details"
      ],
      "additionalProperties": false
}

如何使用 JSchema 生成器生成这样的模式?

是否有一个类级别的数据注释属性可以做到这一点?

【问题讨论】:

    标签: c# json.net jsonschema


    【解决方案1】:

    有点晚了,但我今天很挣扎..

    void Main()
    {
        var generator = new JSchemaGenerator();
        generator.ContractResolver = new CamelCasePropertyNamesContractResolver();
        generator.SchemaIdGenerationHandling = SchemaIdGenerationHandling.TypeName;
        var schema = generator.Generate(typeof(myType));
        RejectAdditionalProperties(schema);
        string jsonSchema = schema.ToString();
    }
    
    static void RejectAdditionalProperties(JSchema schema)
    {
        schema.AllowAdditionalProperties = false;
        foreach(var s in schema.Properties.Values) RejectAdditionalProperties(s);
    }
    
    

    【讨论】:

      【解决方案2】:

      我的 Json 架构有嵌套的数组和对象。 补充@semera 给出的答案:

          static void RejectAdditionalProperties(JSchema schema)
          {
              if(schema.Type == JSchemaType.Object)
              {
                  schema.AllowAdditionalProperties = false;
                  foreach (var v in schema.Properties.Values) RejectAdditionalProperties(v);
              }
      
              if(schema.Type == JSchemaType.Array) 
              { 
                  foreach (var i in schema.Items) RejectAdditionalProperties(i);
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-03
        • 1970-01-01
        • 2022-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-31
        • 2020-01-03
        相关资源
        最近更新 更多