简体   繁体   English

JSON 架构具有不同属性的嵌套对象

[英]JSON Schema with Nested Objects with different properties

The entire JSON file is rather large so I've only taken out the subsection I've had an issue with.整个 JSON 文件相当大,所以我只取出了我遇到问题的小节。

{
  "diagrams": {
    "5f759d15cd046720c28531dd": {
      "_id": "5f759d15cd046720c28531dd",
      "offsetX": 320,
      "offsetY": 42,
      "zoom": 80,
      "modified": 1604279356,
      "nodes": {
        "5f9f5c3ccd046720c28531e4": {
          "nodeID": "5f9f5c3ccd046720c28531e4",
          "type": "start",
          "coords": [
            360,
            120
          ],
          "data": {
            "name": "Start",
            "color": "standard",
            "ports": [
              {
                "type": "",
                "target": "5f9f5c3ccd046720c28531e6"
              }
            ],
            "steps": []
          }
        },
        "5f9f5c3ccd046720c28531e5": {
          "nodeID": "5f9f5c3ccd046720c28531e5",
          "type": "block",
          "coords": [
            760,
            120
          ],
          "data": {
            "name": "Help Message",
            "color": "standard",
            "steps": [
              "5f9f5c3ccd046720c28531e6",
              "5f9f5c3ccd046720c28531e7"
            ]
          }
        },
        "5f9f5c3ccd046720c28531e6": {
          "nodeID": "5f9f5c3ccd046720c28531e6",
          "type": "speak",
          "data": {
            "randomize": false,
            "dialogs": [
              {
                "voice": "Alexa",
                "content": "You said help. Do you want to continue?"
              }
            ],
            "ports": [
              {
                "type": "",
                "target": "5f9f5c3ccd046720c28531e7"
              }
            ]
          }
        },
        "5f9f5c3ccd046720c28531e7": {
          "nodeID": "5f9f5c3ccd046720c28531e7",
          "type": "interaction",
          "data": {
            "name": "Choice",
            "else": {
              "type": "path",
              "randomize": false,
              "reprompts": []
            },
            "choices": [
              {
                "intent": "",
                "mappings": []
              },
              {
                "intent": "",
                "mappings": []
              }
            ],
            "reprompt": null,
            "ports": [
              {
                "type": "else",
                "target": null
              },
              {
                "type": "",
                "target": null
              },
              {
                "type": "",
                "target": "5f9f5c3ccd046720c28531e9"
              }
            ]
          }
        },
        "5f9f5c3ccd046720c28531e8": {
          "nodeID": "5f9f5c3ccd046720c28531e8",
          "type": "block",
          "coords": [
            1170,
            260
          ],
          "data": {
            "name": "Exit",
            "color": "standard",
            "steps": [
              "5f9f5c3ccd046720c28531e9"
            ]
          }
        },
        "5f9f5c3ccd046720c28531e9": {
          "nodeID": "5f9f5c3ccd046720c28531e9",
          "type": "exit",
          "data": {
            "ports": []
          }
        }
      },
      "children": [],
      "creatorID": 42661,
      "variables": [],
      "name": "Help Flow",
      "versionID": "5f759d15cd046720c28531db"
    }
    }
}

The Current JSON Schema Definition I have is:我拥有的当前 JSON 架构定义是:

{
  "$schema":"http://json-schema.org/schema#",
  "type":"object",
  "properties":{
     "diagrams":{
        "type":"object"
     }
  },
  "required":[
     "diagrams",
  ]
}

The problem I am having is that within diagrams contains multiple objects with a random string as the name eg "5f759d15cd046720c28531dd".我遇到的问题是图表中包含多个对象,其名称为随机字符串,例如“5f759d15cd046720c28531dd”。

Then within that object there are properties such as (_id, offsetX) which I want to express as well as a nodes object, which again contains multiple objects with arbitrary names eg ("5f9f5c3ccd046720c28531e4", "5f9f5c3ccd046720c28531e5", ...) which have a unique node definition where some nodes have different properties to other nodes (nodeID, type, data vs nodeID, type, data, coords). Then within that object there are properties such as (_id, offsetX) which I want to express as well as a nodes object, which again contains multiple objects with arbitrary names eg ("5f9f5c3ccd046720c28531e4", "5f9f5c3ccd046720c28531e5", ...) which have一个独特的节点定义,其中一些节点与其他节点具有不同的属性(nodeID、type、data vs nodeID、type、data、coords)。

My question is with all these arbitrary things such as random names as well as different properties per each node.我的问题是所有这些任意的东西,例如随机名称以及每个节点的不同属性。 How do I turn it into 1 JSON schema definition which covers all the cases of how a diagram/node can be made.如何将其转换为 1 JSON 模式定义,它涵盖了如何制作图表/节点的所有情况。

You can do this with additionalProperties or patternProperties .您可以使用additionalPropertiespatternProperties来做到这一点。

additionalProperties applies to any property that isn't declared in properties or patternProperties . additionalProperties适用于未在propertiespatternProperties中声明的任何属性。

{
  "type": "object",
  "additionalProperties": {
    "type": "object",
    "properties": {
      "_id": { ... },
      "offsetX": { ... },
      ...
    }
  }
}

Your property names appear to always be hex numbers.您的属性名称似乎始终是十六进制数字。 If you want to enforce that those property names are always hex numbers, you can use patternProperties .如果您想强制这些属性名称始终是十六进制数字,您可以使用patternProperties Any property that matches the regex must conform to that schema.任何与正则表达式匹配的属性都必须符合该模式。

{
  "type": "object",
  "patternProperties": {
    "^[0-9a-f]{24}$": {
      "type": "object",
      "properties": {
        "_id": { ... },
        "offsetX": { ... },
        ...
      }
    }
  },
  "additionalProperties": false
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM