【问题标题】:JSON schema where keys have different names键具有不同名称的 JSON 模式
【发布时间】:2016-09-29 14:05:49
【问题描述】:
{"57ecf565817bc3932d8de349": {
  "prices": {

    "2017-07-01": {
      "summer": -1, 
      "winter": -1, 
      "xmas": -1},

    "2017-08-05": {
      "summer": -1, 
      "winter": -1, 
      "xmas": -1}
    }
  }
}

如何编写每个键不同的 JSON 模式(此处:2017-07-01、2017-08-05)所以我不能使用 items,如本示例中的 http://json-schema.org/example1.html#definitions(产品集架构)。

这是我的架构:

{
  "type": "object",
  "properties": {
    "57ecf565817bc3932d8de349": {
      "type": "object",
      "properties": {
        "prices": {
          "type": "object",
          "properties": {
            "2017-07-01": {
              "type": "object",
              "properties": {
                "summer": {
                  "type": "integer"
                },
                "winter": {
                  "type": "integer"
                },
                "xmas": {
                  "type": "integer"
                }
              },
              "required": [
                "summer",
                "winter",
                "xmas"
              ]
            },
            "2017-08-05": {
              "type": "object",
              "properties": {
                "summer": {
                  "type": "integer"
                },
                "winter": {
                  "type": "integer"
                },
                "xmas": {
                  "type": "integer"
                }
              },
              "required": [
                "summer",
                "winter",
                "xmas"
              ]
            }
          },
          "required": [
            "2017-07-01",
            "2017-08-05"
          ]
        }
      },
      "required": [
        "prices"
      ]
    }
  },
  "required": [
    "57ecf565817bc3932d8de349"
  ]
}

在我的原始 JSON 中,我有很多这样的日期:2017-07-01,我想避免为每个日期重复架构。

【问题讨论】:

  • 您的属性名称是完全动态的。您无法为此编写架构。
  • @TomRedfern 即使每个日期的结构相同,也无法编写模式?
  • 没有。请看下面我的回答。您应该定义一个 STATIC 数据结构。

标签: json jsonschema


【解决方案1】:

您可以使用 additionalProperties 关键字来执行此操作。在此示例中,对象中的每个属性都必须针对给定的架构进行验证。

{
  "type": "object",
  "additionalProperties": {
    "type": "object",
    "properties": {
      "summer": { "type": "integer" },
      "winter": { "type": "integer" },
      "xmas": { "type": "integer" }
    },
    "required": ["summer", "winter", "xmas"]
  }
}

【讨论】:

    【解决方案2】:

    使用模式属性

    https://json-schema.org/understanding-json-schema/reference/object.html#pattern-properties

    类似

    {
      "type": "object",
      "patternProperties": {
        "^\d{4}-\d{2}-\d{2}": { 
          "type": "object",
          "properties": {
             "summer": {
                "type": "integer"
             },
             "winter": {
               "type": "integer"
               etc...
    

    【讨论】:

      【解决方案3】:

      模式定义了一个静态数据结构。

      因此,您不能为动态数据结构编写模式。

      这不仅适用于 JSON,也适用于 XSD/SQL/protobuf 等。模式是一个严格的物理蓝图,用于显示事物的外观。

      您最好为数据定义静态类型,并执行以下操作:

      {
          "type":"object",
          "properties":{
              "resource":{
                  "type":"object",
                  "properties":{
                      "hash":{
                          "type":"string"
                      },
                      "prices":{
                          "type":"array",
                          "items":{
                              "$ref":"#/definitions/price"
                          },
                          "minItems":1
                      }
                  },
                  "required":[
                      "hash",
                      "prices"
                  ]
              }
          },
          "definitions":{
              "price":{
                  "type":"object",
                  "properties":{
                      "date":{
                          "type":"string"
                      },
                      "summer":{
                          "type":"integer"
                      },
                      "winter":{
                          "type":"integer"
                      },
                      "xmas":{
                          "type":"integer"
                      }
                  },
                  "required":[
                      "date",
                      "summer",
                      "winter",
                      "xmas"
                  ]
              }
          }
      }
      

      这将允许您拥有作为您的实例:

      {
          "resource":{
              "hash":"57ecf565817bc3932d8de349",
              "prices":[
                  {
                      "date":"2017-07-01",
                      "summer":-1,
                      "winter":-1,
                      "xmas":-1
                  },
                  {
                      "date":"2017-08-05",
                      "summer":-1,
                      "winter":-1,
                      "xmas":-1
                  }
              ]
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2016-08-06
        • 2023-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多