验证自定义JSON架构



我正在尝试验证Python 3中的自定义JSON模式。我正在使用JSON Schema中的本教程,并使用在线工具JSON Schema验证器对其进行验证,这是他们在实现部分的Web(在线(一节中提到的工具之一。

在定义了我的JSON模式、填写了一个示例并在在线工具中进行了测试之后,它说这很好。但问题是,如果我更改节点的名称(主节点除外(,它会一直说没关系。这就是我不理解的。

我是这样定义这个计划的(这是错误的(。如果因为我不得不匿名数据而难以理解,我深表歉意:

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://my-program/schema.json",
"title": "A title",
"description": "A description",
"type": "object",
"properties": {
"root": {
"description": "A description",
"type": "array",
"items": {
"type": "object"
},
"minItems": 1,
"uniqueItems": false,
"properties": {
"a": {
"description": "A description",
"type": "string"
},
"b": {
"description": "A description",
"type": "string"
},
"c": {
"description": "A description",
"type": "string"
},
"d": {
"description": "A description",
"type": "object",
"properties": {
"d_a": {
"description": "A description",
"type": "object"
},
"d_b": {
"description": "A description",
"type": "object"
},
"d_c": {
"description": "A description",
"type": "object",
"properties": {
"d_c_a": {
"description": "A description",
"type": "object",
"properties": {
"d_c_a_a": {
"description": "A description",
"type": "array",
"items": {
"type": "string"
},
"minItems": 0,
"uniqueItems": false
}
},
"required": [
"d_c_a_a"
]
},
"d_c_b": {
"description": "A description",
"type": "object",
"properties": {
"d_c_b_a": {
"description": "A description",
"type": "array",
"items": {
"type": "string"
},
"minItems": 0,
"uniqueItems": false
}
},
"required": [
"d_c_b_a"
]
},
"d_c_c": {
"description": "A description",
"type": "object",
"properties": {
"d_c_c_a": {
"description": "A description",
"type": "array",
"items": {
"type": "string"
},
"minItems": 0,
"uniqueItems": false
},
"d_c_c_b": {
"description": "A description",
"type": "string"
}
},
"required": [
"d_c_c_a",
"d_c_c_b"
]
}
},
"required": [
"d_c_a",
"d_c_b",
"d_c_c"
]
}
},
"required": [
"d_a",
"d_b",
"d_c"
]
},
"e": {
"description": "A description",
"type": "array",
"items": {
"type": "object"
},
"minItems": 1,
"uniqueItems": true,
"properties": {
"e_a": {
"description": "A description",
"type": "string"
},
"e_b": {
"description": "A description",
"type": "string"
},
"e_c": {
"description": "A description",
"type": "string"
},
"e_d": {
"description": "A description",
"type": "string"
},
"e_e": {
"description": "A description",
"type": "string"
},
"e_f": {
"description": "A description",
"type": "string"
}
},
"required": [
"e_a",
"e_b",
"e_c",
"e_d",
"e_e",
"e_f"
]
},
"f": {
"description": "A description",
"type": "integer"
},
"g": {
"description": "A description",
"type": "boolean"
},
"h": {
"description": "A description",
"type": "object",
"properties": {
"h_a": {
"description": "A description",
"type": "array",
"items": {
"type": "string"
},
"minItems": 0,
"uniqueItems": true
},
"h_b": {
"description": "A description",
"type": "array",
"items": {
"type": "string"
},
"minItems": 0,
"uniqueItems": true
},
"h_c": {
"description": "A description",
"type": "array",
"items": {
"type": "string"
},
"minItems": 0,
"uniqueItems": true
}
},
"required": [
"h_a",
"h_b",
"h_c"
]
}
},
"required": [
"a",
"b",
"c",
"d",
"e",
"f",
"g",
"h"
]
}
},
"required": [
"root"
]
}

我试图验证的JSON看起来像:

{
"root": [
{
"a": "Bla bla",
"b": "Bla bla",
"c": "Bla bla",
"d": {
"d_a": {
"something random": 0,
"something random": 4
},
"d_b": {
"something random": "Bla bla",
"something random": 0
},
"d_c": {
"d_c_a": {
"d_c_a_a": [
"something random"
]
},
"d_c_b": {
"d_c_b_a": [
"something random",
"something random",
"something random"
]
},
"d_c_c": {
"d_c_c_a": [
"something random"
],
"d_c_c_b": "something random"
}
}
},
"e": [
{
"e_a": "something random",
"e_b": "something random",
"e_c": "something random",
"e_d": "something random",
"e_e": "something random",
"e_f": "something random"
},
{
"e_a": "something random",
"e_b": "something random",
"e_c": "something random",
"e_d": "something random",
"e_e": "something random",
"e_f": "something random"
}
],
"f": 0,
"g": true,
"h": {
"h_a": [
"something random"
],
"h_b": [
"something random"
],
"h_c": [
"something random"
]
}
},
{
"a": "Bla bla",
"b": "Bla bla",
"c": "Bla bla",
"d": {
"d_a": {
"something random": 0,
"something random": 4
},
"d_b": {
"something random": "Bla bla",
"something random": 0
},
"d_c": {
"d_c_a": {
"d_c_a_a": [
"something random"
]
},
"d_c_b": {
"d_c_b_a": [
"something random",
"something random",
"something random"
]
},
"d_c_c": {
"d_c_c_a": [
"something random"
],
"d_c_c_b": "something random"
}
}
},
"e": [
{
"e_a": "something random",
"e_b": "something random",
"e_c": "something random",
"e_d": "something random",
"e_e": "something random",
"e_f": "something random"
},
{
"e_a": "something random",
"e_b": "something random",
"e_c": "something random",
"e_d": "something random",
"e_e": "something random",
"e_f": "something random"
}
],
"f": 0,
"g": true,
"h": {
"h_a": [
"something random"
],
"h_b": [
"something random"
],
"h_c": [
"something random"
]
}
}
]
}

如果我将root更改为nono,则验证器会抛出错误,或者如果我删除root。但对于其余的元素,它总是说没关系。即使我更改了名称或删除了它们。

我做错了什么?

谨致问候。

好的,问题是properties字段的嵌套没有在字段items中进行。

这是固定模板:

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://example.com/product.schema.json",
"title": "A title",
"description": "A description",
"type": "object",
"properties": {
"root": {
"type": "array",
"items": {
"type": "object",
"properties": {
"a": {
"description": "A description",
"type": "string"
},
"b": {
"description": "A description",
"type": "string"
},
"c": {
"description": "A description",
"type": "string"
},
"d": {
"description": "A description",
"type": "object",
"properties": {
"d_a": {
"description": "A description",
"type": "object"
},
"d_b": {
"description": "A description",
"type": "object"
},
"d_c": {
"description": "A description",
"type": "object",
"properties": {
"d_c_a": {
"description": "A description",
"type": "object",
"properties": {
"d_c_a_a": {
"description": "A description",
"type": "array",
"items": {
"type": "string"
},
"minItems": 0,
"uniqueItems": true
}
},
"required": ["d_c_a_a"]
},
"d_c_b": {
"description": "A description",
"type": "object",
"properties": {
"d_c_b_a": {
"description": "A description",
"type": "array",
"items": {
"type": "string"
},
"minItems": 0,
"uniqueItems": true
},
},
"required": ["d_c_b_a"]
},
"d_c_c": {
"description": "A description",
"type": "object",
"properties": {
"d_c_c_a": {
"description": "A description",
"type": "array",
"items": {
"type": "string"
},
"minItems": 0,
"uniqueItems": true
},
"d_c_c_b": {
"description": "A description",
"type": "string"
}
},
"required": ["d_c_c_a", "d_c_c_b"]
}
},
"required": ["d_c_a", "d_c_b", "d_c_c"]
},
},
"required": ["d_a", "d_b", "d_c"]
},
"e": {
"description": "A description",
"type": "array",
"items": {
"type": "object",
"properties": {
"e_a": {
"description": "A description",
"type": "string"
},
"e_b": {
"description": "A description",
"type": "string"
},
"e_c": {
"description": "A description",
"type": "string"
},
"e_d": {
"description": "A description",
"type": "string"
},
"e_e": {
"description": "A description",
"type": "string"
},
"e_f": {
"description": "A description",
"type": "string"
}
},
"required": ["e_a", "e_b", "e_c", "e_d", "e_e", "e_f"]
},
"minItems": 1,
"uniqueItems": true,
},
"f": {
"description": "A description",
"type": "integer"
},
"g": {
"description": "A description",
"type": "boolean"
},
"h": {
"description": "A description",
"type": "object",
"properties": {
"h_a": {
"description": "A description",
"type": "array",
"items": {
"type": "string"
},
"minItems": 0,
"uniqueItems": true
},
"h_b": {
"description": "A description",
"type": "array",
"items": {
"type": "string"
},
"minItems": 0,
"uniqueItems": true
},
"h_c": {
"description": "A description",
"type": "array",
"items": {
"type": "string"
},
"minItems": 0,
"uniqueItems": true
}
},
"required": ["h_a", "h_b", "h_c"]
}
},
"required": ["a", "b", "c", "d", "e", "f", "g", "h"]
},
"minItems": 1,
"uniqueItems": true,
},
},
"required": ["root"]
}

这里有一个工作示例:

{
"root": [
{
"a": "Bla bla",
"b": "Bla bla",
"c": "Bla bla",
"d": {
"d_a": {
"something random": 0,
"something random": 4
},
"d_b": {
"something random": "Bla bla",
"something random": 0
},
"d_c": {
"d_c_a": {
"d_c_a_a": [
"something random"
]
},
"d_c_b": {
"d_c_b_a": [
"something random_1",
"something random_2",
"something random_3"
]
},
"d_c_c": {
"d_c_c_a": [
"something random"
],
"d_c_c_b": "something random"
}
}
},
"e": [
{
"e_a": "something random_1",
"e_b": "something random_2",
"e_c": "something random_3",
"e_d": "something random_4",
"e_e": "something random_5",
"e_f": "something random_6"
},
{
"e_a": "something random_7",
"e_b": "something random_8",
"e_c": "something random_9",
"e_d": "something random_10",
"e_e": "something random_11",
"e_f": "something random_12"
}
],
"f": 0,
"g": true,
"h": {
"h_a": [
"something random_1"
],
"h_b": [
"something random_2"
],
"h_c": [
"something random_3"
]
}
},
{
"a": "Bla bla",
"b": "Bla bla",
"c": "Bla bla",
"d": {
"d_a": {
"something random": 0,
"something random": 4
},
"d_b": {
"something random": "Bla bla",
"something random": 0
},
"d_c": {
"d_c_a": {
"d_c_a_a": [
"something random"
]
},
"d_c_b": {
"d_c_b_a": [
"something random_1",
"something random_2",
"something random_3"
]
},
"d_c_c": {
"d_c_c_a": [
"something random"
],
"d_c_c_b": "something random"
}
}
},
"e": [
{
"e_a": "something random_1",
"e_b": "something random_2",
"e_c": "something random_3",
"e_d": "something random_4",
"e_e": "something random_5",
"e_f": "something random_6"
},
{
"e_a": "something random_7",
"e_b": "something random_8",
"e_c": "something random_9",
"e_d": "something random_10",
"e_e": "something random_11",
"e_f": "something random_12"
}
],
"f": 0,
"g": true,
"h": {
"h_a": [
"something random"
],
"h_b": [
"something random"
],
"h_c": [
"something random"
]
}
}
]
}

问候!

最新更新