gpt4 book ai didi

jsonschema - 在 anyOf 中为 JSON Schema 嵌套 oneOf

转载 作者:行者123 更新时间:2023-12-03 23:50:47 24 4
gpt4 key购买 nike

这是 JSON 模式和 JSON,如下面的链接中提供的用于说明目的。

JSON Schema and the JSON

格式:
数组中的单个 JSON 对象(具有它们的附加属性,可能会随数组中的其他对象而变化)可以是任何 3 个区域:'america'、'asia' 和 'europe' 并且至少在区域对象的类型上应该在那里。这可以通过数组 minItems 属性来实现)

问题陈述:

  • 数组中的单个 JSON 对象可以是任何 3 个区域:'america'、'asia' 和 'europe',至少区域对象的类型应该在那里

    ==> 我可以通过将所有区域对象放在 anyOf 数组中来解决这个问题,因为我想匹配至少一个有效的区域对象。
  • JSON 对象 'asia' 或 'europe' 可以与其他区域类型一起存在。两者不能共存。

    ==> 我尝试使用 'oneOf' 但它通过了 ajv 验证。其实应该失败。任何人都可以帮忙。感谢

  • JSON 架构
    {
    "type": "object",
    "properties": {
    "stat_data": {
    "type": "array",
    "minItems": 1,
    "items": {
    "type": "object",
    "properties": {},
    "anyOf": [{
    "required": ["region"],
    "properties": {
    "region": {
    "enum": ["america"]
    },
    "country": {
    "type": "string"
    },
    "population": {
    "type": "string"
    }
    }
    },
    {
    "oneOf": [
    {
    "required": ["region"],
    "properties": {
    "region": {
    "enum": ["asia"]
    },
    "country": {
    "type": "string"
    },
    "details": {
    "type": "object",
    "properties": {
    "language": {
    "type": "string"
    },
    "tz": {
    "type": "string"
    }
    }
    }
    }
    }, {
    "required": ["region"],
    "properties": {
    "region": {
    "enum": ["europe"]
    },
    "country": {
    "type": "string"
    },
    "language": {
    "type": "string"
    }
    }
    }
    ]
    }
    ]
    }
    }
    }
    }

    JSON 对象失败,因为“亚洲”和“欧洲”类型对象不能共存。
    {
    "stat_data": [{
    "region": "america",
    "country": "USA",
    "states": "50"
    }, {
    "region": "asia",
    "country": "Japan",
    "details": {
    "language": "Japanese",
    "tz": "utc+9.00"
    }
    }, {
    "region": "europe",
    "country": "finland",
    "language": "Finnish"
    }
    ]
    }

    JSON 对象作为唯一存在的“asia”类型对象传递。
    {
    "stat_data": [{
    "region": "america",
    "country": "USA",
    "states": "50"
    }, {
    "region": "asia",
    "country": "Japan",
    "details": {
    "language": "Japanese",
    "tz": "utc+9.00"
    }
    }
    ]
    }

    JSON 对象作为唯一的“欧洲”类型对象存在。
    {
    "stat_data": [{
    "region": "america",
    "country": "USA",
    "states": "50"
    }, {
    "region": "europe",
    "country": "finland",
    "language": "Finnish"
    }
    ]
    }

    最佳答案

    我可以理解你为什么尝试你所做的方法,但是它没有按预期工作,因为你已经定义了,数组中的每个项目可能是 america或( europeasia ),这不是您想要的。

    记住,items将值模式应用于数组中的每个元素。它对整个数组本身没有任何限制。 contains检查数组中的至少一项是否根据其值模式进行了验证。

    你要说的是,数组中的每一项都可能有americaeuropeasia ,但数组可能不包含 europe如果它包含 asia ,反之亦然。

    我重构了架构并进行了一些更改。

    希望你也能看出 oneOf 的使用意图很明确>> ( containsnot > contains )。

    JSON Schema 通过添加约束来工作。您通常不能通过省略来定义约束。

    JSON Schema and data validation demo

    {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "definitions": {
    "containtsAsia": {
    "contains": {
    "properties": {
    "region": {
    "const": "asia"
    }
    }
    }
    },
    "containsEurope": {
    "contains": {
    "properties": {
    "region": {
    "const": "europe"
    }
    }
    }
    }
    },
    "type": "object",
    "properties": {
    "stat_data": {
    "type": "array",
    "minItems": 1,
    "items": {
    "type": "object",
    "properties": {
    "region": {
    "enum": [
    "america",
    "asia",
    "europe"
    ]
    },
    "country": {
    "type": "string"
    },
    "population": {
    "type": "string"
    }
    }
    },
    "oneOf": [
    {
    "allOf": [
    {
    "$ref": "#/definitions/containtsAsia"
    },
    {
    "not": {
    "$ref": "#/definitions/containsEurope"
    }
    }
    ]
    },
    {
    "allOf": [
    {
    "$ref": "#/definitions/containsEurope"
    },
    {
    "not": {
    "$ref": "#/definitions/containtsAsia"
    }
    }
    ]
    }
    ]
    }
    }
    }

    关于jsonschema - 在 anyOf 中为 JSON Schema 嵌套 oneOf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58172931/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com