【问题标题】:How to define custom object type in json-schema如何在 json-schema 中定义自定义对象类型
【发布时间】:2015-11-22 16:16:53
【问题描述】:

假设我有几个对象,例如 Vehicle 和 Computer。

{"brand":"Ford", "dateOfManufacture":"23/082015"}
{"brand":"Apple", "dateOfManufacture":"23/082015"}

我知道我可以像下面这样表示车辆架构。但是,查看架构并不能告诉我它是对象类型车辆还是计算机。如何将这些信息放在 JSON 中。 json-schema 是否提供自定义类型支持。因此,我可以说“type”:“vehicle”,而不是说“type”:“object”。

{
    "description": "schema validating people", 
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
      "properties": { 
            "firstName": {"type": "string"}, 
            "lastName": {"type": "string"}
        }
   }
}

TIA

【问题讨论】:

    标签: json schema jsonschema


    【解决方案1】:

    虽然您无法显式定义新的type,但您可以定义一个描述该类型对象外观的架构,然后在您的主架构中引用它。

    {
        "$schema": "http://json-schema.org/draft-07/schema",
        "definitions": {
            "vehicle": {
                "type": "object",
                "properties": {
                    "brand": {
                        "type": "string", 
                        "enum": ["ford","toyota"]
                    },
                    "dateOfManufacture": {
                        "type": "string"
                    }
                }
            }
        },
        "type": "object",
        "properties": {
            "primary": { "$ref": "#/definitions/vehicle" },
            "secondary": { "$ref": "#/definitions/vehicle" }
        }
    }
    

    此示例描述了一个对象,其字段 primarysecondary 均为“类型”vehicle - 即数据必须与描述 vehicle 外观的架构匹配。

    在类型化编程语言中,类型的概念用于传达数据的形状,但也用于传达有关数据身份的信息 - 即它为结构的特定定义提供身份或名称。

    struct Foo { int a; string b; }
    struct Bar { int a; string b; }
    
    function quux(Foo foo) { ... }
    

    在这个虚拟示例中,您不能将Bar 传递给Quux,即使它看起来就像Foo。这是因为除了描述数据的形状 (int a; string b;) 之外,类型还定义了数据结构的标识。

    JsonSchema 是关于描述数据的形状 - 即原始类型如何组合成某种结构,但没有说明身份。它关心字段的名称以及它们的结构,但不关心您所称的架构(或类似地,struct 的名称)。

    【讨论】:

      【解决方案2】:

      您也可以在架构中添加产品类型,例如:-

      {"brand":"Ford", "dateOfManufacture":"23/082015", "productType":"vehicle"}
      {"brand":"Apple", "dateOfManufacture":"23/082015", "productType":"computer"}
      

      在决定架构时,您可以确保它包含产品分类所需的所有信息。

      【讨论】:

      • 是的,这是我想知道 json-schema 是否提供自定义类型支持的一种选择。所以我可以说“type”:“vehicle”,而不是说“type”:“object”
      • type 关键字指的是 JSON 原始类型。自 json-schema v4 起无法扩展。您通过 $ref 关联“父”模式。如果您正在考虑架构继承,请查看之前回答的问题:stackoverflow.com/questions/27410216/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-21
      • 2019-12-27
      • 2019-11-15
      • 2019-12-15
      • 1970-01-01
      • 2013-03-18
      • 2017-01-21
      相关资源
      最近更新 更多