如何在json-schema中定义自定义对象类型

时间:2015-08-28 05:04:17

标签: json schema jsonschema

假设我有几个对象,如车辆和计算机。

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

我知道我可以代表下面的车辆架构。然而,查看模式并不告诉我它的对象类型车辆或计算机。如何将该信息放入JSON中。 json-schema是否提供自定义类型支持。所以不要说“类型”:“对象”可以说“类型”:“车辆”。

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

TIA

2 个答案:

答案 0 :(得分:3)

虽然您不能显式定义新的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的名称)。

答案 1 :(得分:0)

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

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

在确定架构时,您可以确保它具有产品分类的所有必要信息。