【问题标题】:JSON Schema typesJSON 模式类型
【发布时间】:2012-11-19 12:16:38
【问题描述】:

我想使用 JSON Schema 并允许新类型(目前有字符串数字数组对象 boolean 和 null)

例如我想为联系人添加一个类型

在 JSON 中甚至可能吗?有什么建议吗?

谢谢

【问题讨论】:

    标签: jsonschema


    【解决方案1】:

    如果您的目标是定义一次 contact 并多次重复使用它,您可以为名为 contactobject 创建一个定义,然后在需要时随时使用 JSON 指针引用它。

    其中一个示例可能如下所示:

    {
        "type": "object",
        "definitions": {
            "contact": {
                "properties": {
                    "name": {
                    "type": "string"
                     },
                     "phone": {
                        "type": "string"
                    }
                }
            }
        },
        "properties": {
            "Person": {
                "properties": {
                    "contact": {
                        "$ref" : "#/definitions/contact"
                    },
                    "birthday": {
                        "type": "string",
                        "format": "date-time"
                    }
                }
            },
            "Company": {
                "properties": {
                    "contact": {
                        "$ref" : "#/definitions/contact"
                    },
                    "inBusinessSince" : {
                        "type": "string",
                        "format": "date-time"
                    }
                }
            }
        }
    }
    

    现在假设您希望在 Company 的 contact 属性上拥有比在 Person 上更多的属性。您可以使用 allOf 关键字,这样上面的 Company 现在看起来像这样:

    "Company": {
        "properties": {
            "contact": {
                "allOf": [
                    {"$ref" : "#/definitions/contact"},
                    {
                        "properties": {
                            "fax": {
                                "type": "string"
                        }
                    }
                ],
               "inBusinessSince" : {
                   "type": "string",
                   "format": "date-time"
                }
            }
        }
    

    有关更多信息,请参阅以下链接。

    【讨论】:

    • 这是正确的答案:对可重用类型使用“$ref”。
    【解决方案2】:

    是的,我们可以在 JSON 中添加联系人类型

    假设您的程序需要这种格式的联系人类型的数据

    {
    contact: [
    {contactid:1, contactname: "abc", address:"abcdfg"},
    {contactid:2, contactname: "hjk", address:"hjkdfg"}
    ]
    }
    

    这里的 Contact 对象有一个 id、name 和 address。 我们可以为联系人创建一个模式

    {
    "type" : "object",
    "properties": {
             "contact":{
                  "type":"object"
                  "items":{
                      "type": "object",
                      "properties":{
                              "contactid": {"type":"number"}
                              "contactname": {"type":"string"}
                              "address": {"type":"string"}
                                   }
                          }
                       }
                    }
    } 
    

    【讨论】:

    • 好的,但我的意思是:"myContact": { "type":"contact", "unique": true } 并且在 jsonschema 中将解释什么是 "contact"
    • 是的,我理解你的问题,你想创建一个新类型的联系人,你想创建一个联系人类型的数据,所以在第二个代码块中我们创建了联系人对象,然后在第一个块我们定义了两个联系人类型实体的代码,您可以像“contactperson”:(“type”:“contact”)一样使用它,对于contactperson,您可以初始化联系人的所有三个属性。
    • +1,OP 很困惑。您不能在不指定其组成的情况下即时指定复杂类型。 json 模式和 json.net 完全支持任何有效 json 的模式。
    【解决方案3】:

    “联系人”的类型应该是对象类型,不是吗?然后这个对象有几个属性,例如一个包含地址的字符串。所以根本不需要定义新类型,因为每个新类型——如果你把它分解的话——都由原始类型字符串、数字、数组或对象组成。

    所以你可以写一个联系人:

    "contact"{
        "id": "contact",
        "required": false,
        "type": "object",
        "properties":{
            "address"{
                "id": "address",
                "required": true,
                "type": "string"
            }
            "phoneNumbers"{
                "id": "phoneNumbers",
                "required": false,
                "type": "array",
                "items":{
                    "id": "0",
                    "required": false,
                    "type": "object",
                    "properties":{
                        "type"{
                            "id": "type",
                            "required": false,
                            "type": "string"
                        }
                        "number"{
                            "id": "number",
                            "required": false,
                            "type": "string"
                        }
                    }
                }
            }
        }
    }
    

    根据此架构,一个简单的联系人对象可能如下所示:

    {
        "address": "Example Street 123",
        "phoneNumbers":
        [
            {
                "type": "home",
                "number": "123-456789"
            }
        ]
    } 
    

    现在假设您在另一个对象中有多个联系人,那么您必须在存储联系人的每个位置添加联系人架构。
    如上所述,我认为没有必要引入新类型,尽管您的架构可以变得非常非常大。除此之外,我不知道任何允许新原始类型的 JSON 模式规范。

    【讨论】:

    • 评论提到您必须在每个地方添加联系人架构。似乎您可以通过引用来做到这一点,例如 "geo": { "$ref": "http://json-schema.org/geo" }.
    【解决方案4】:

    有一个 json 架构:http://json-schema.org/card

    要将其包含在您的 json 架构中:

    {
        "contact": { "$ref": "http://json-schema.org/card"}
    }
    

    【讨论】:

      猜你喜欢
      • 2016-12-21
      • 2020-09-14
      • 2020-02-05
      • 2017-04-14
      • 2012-10-13
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 2011-12-12
      相关资源
      最近更新 更多