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

Ris*_*raf 6 schema json jsonschema

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

{"brand":"Ford", "dateOfManufacture":"23/082015"}
{"brand":"Apple", "dateOfManufacture":"23/082015"}
Run Code Online (Sandbox Code Playgroud)

我知道我可以表示如下的车辆模式。然而,查看模式并不能告诉我它是对象类型车辆还是计算机。如何将该信息放入 JSON。json-schema 是否提供自定义类型支持。因此,与其说“类型”:“对象”,不如说“类型”:“车辆”。

{
    "description": "schema validating people", 
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
      "properties": { 
            "firstName": {"type": "string"}, 
            "lastName": {"type": "string"}
        }
   }
}
Run Code Online (Sandbox Code Playgroud)

TIA

Gor*_*ean 6

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

{
    "$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" }
    }
}
Run Code Online (Sandbox Code Playgroud)

这个例子描述了一个具有字段primary并且secondary都是“类型”的对象vehicle——即数据必须与描述 avehicle外观的模式相匹配。

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

struct Foo { int a; string b; }
struct Bar { int a; string b; }

function quux(Foo foo) { ... }
Run Code Online (Sandbox Code Playgroud)

在这个虚拟例如,你可以不通过Bar进入Quux,即使它看起来就像一个Foo。这是因为除了描述数据的形状 ( int a; string b;) 之外,类型还定义了数据结构的身份。

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


Ami*_*ati 1

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

{"brand":"Ford", "dateOfManufacture":"23/082015", "productType":"vehicle"}
{"brand":"Apple", "dateOfManufacture":"23/082015", "productType":"computer"}
Run Code Online (Sandbox Code Playgroud)

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

  • type 关键字指的是 JSON 原始类型。从 json-schema v4 开始就无法扩展。您可以通过 $ref 关联“父”模式。如果您正在考虑模式继承,请查看之前回答的问题:http://stackoverflow.com/questions/27410216/json-schema-and-inheritance (4认同)