验证自定义 JSON 架构

Validate custom JSON schema

我正在尝试验证 Python 中的自定义 JSON 架构 3. 我正在使用 this tutorial from JSON Schema and validating it with an online tool, JSON Schema validator, that is one of the tools that they refer to in the Web (Online) section of the Implementation section.

定义我的 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"
        ]
      }
    }
  ]
}

此致!