gpt4 book ai didi

jsonschema - JSON-Schema,基本示例未验证

转载 作者:行者123 更新时间:2023-12-04 19:29:03 26 4
gpt4 key购买 nike

我有以下示例架构:

{
"id": "http://schema.acme.com/widgets",
"$schema": "http://json-schema.org/draft-06/schema#",
"definitions": {
"bentWidget": {
"type": "object",
"required": ["angle", "baseWidget"],
"properties": {
"angle": {
"type": "number",
"minimum": 0,
"maximum": 90
},
"baseWidget": {
"$ref": "#/definitions/baseWidget"
}
}
},
"highPowerWidget": {
"type": "object",
"required": ["power", "baseWidget"],
"properties": {
"power": {
"type": "number",
"minimum": 101,
"maximum": 200
},
"baseWidget": {
"$ref": "#/definitions/baseWidget"
}
}
},
"color": {
"description": "the color of a widget",
"type": "string"
},
"baseWidget": {
"description": "The base type for a widget",
"type": "object",
"required": [
"title",
"version",
"colors"
],
"properties": {
"title": {
"type": "string",
"maximum": 100,
"minimum": 1,
"pattern": "^[a-zA-Z]+((_[a-zA-Z]+)*|([a-zA-Z]+_)*|_)"
},
"flanged": {
"type": "boolean"
},
"version": {
"type": "string",
"maximum": 64,
"minimum": 1
},
"colors": {
"type": "array",
"items": {
"$ref": "#/definitions/color"
}
}
}
}
},

"anyOf": [
{ "$ref": "#/definitions/baseWidget" },
{ "$ref": "#/definitions/bentWidget" },
{ "$ref": "#/definitions/highPowerWidget" }
]
}

我想测试它,所以我把它写到一个文件中:
{
"type": "highPowerWidget",
"title": "foobar",
"version": "foo"
}

然后我从 shell 对它运行 ajv
$ ajv -s widgetSchema.json -d widget-highPower.json 
widget-highPower.json valid

它告诉我它是有效的,这是不正确的,highPowerWidget 必须具有 power 属性,以及“继承的”版本和颜色属性。

我能够通过删除 anyOf 部分并放入如下内容来测试我的个人模式:
"properties": {
"testObject": {
"type": "object",
"oneOf": [
{ "$ref": "#/definitions/baseWidget" },
{ "$ref": "#/definitions/bentWidget" },
{ "$ref": "#/definitions/highPowerWidget" }
]
}
},
"required": [ "testObject" ]

并验证此 JSON:
{
"testObject": {
"type" : "highPowerWidget",
"title" : "title",
"version" : "baz",
"colors" : [ "red", "green", "blue"],
"flanged" : true
}

}

但这似乎是错误的,原因有二。
  • 我不应该有“testObject”属性
  • oneOf 仅在我列出一行时起作用,使用多行验证任何内容。

  • 我想我对如何编写或至少测试我的模式有一个基本的误解。我的目标是拥有一组全部验证的对象,以及一组全部失败的文件。这样我就可以对我的架构进行单元测试。

    最佳答案

    您的架构有效。正如所写,这将是一个有效的 highPowerWidget:

    {
    "power": 150,
    "baseWidget":{
    "title": "SuperHighPower",
    "flanged":true,
    "version": "version 1",
    "colors":["blue"]
    }
    }

    我认为误解是 JSONSchema 不支持 OO style inheritance .

    相反,这个模式本质上是要求 highPowerWidget 或bentWidget 上的“baseWidget”属性。 Here's a sandbox plnkr对于 AJV,您可以对其进行测试。

    编辑 : 想想看,你可以完成这个,从bentWidget 和highPowerWidget 中删除baseWidget 属性,改为添加 "allOf":[{"$ref":"#/definitions/baseWidget"}]到每个子小部件。这将要求他们传递 baseWidget 的架构。所以你的架构将是:
    {
    "id": "http://schema.acme.com/widgets",
    "$schema": "http://json-schema.org/draft-06/schema#",
    "definitions": {
    "bentWidget": {
    "type": "object",
    "required": ["angle"],
    "properties": {
    "angle": {
    "type": "number",
    "minimum": 0,
    "maximum": 90
    }
    },
    allOf: [{
    "$ref": "#/definitions/baseWidget"
    }]
    },
    "highPowerWidget": {
    "type": "object",
    "required": ["power"],
    "properties": {
    "power": {
    "type": "number",
    "minimum": 101,
    "maximum": 200
    }
    },
    allOf: [{
    "$ref": "#/definitions/baseWidget"
    }]
    },
    "color": {
    "description": "the color of a widget",
    "type": "string"
    },
    "baseWidget": {
    "description": "The base type for a widget",
    "type": "object",
    "required": [
    "title",
    "version",
    "colors"
    ],
    "properties": {
    "title": {
    "type": "string",
    "maximum": 100,
    "minimum": 1,
    "pattern": "^[a-zA-Z]+((_[a-zA-Z]+)*|([a-zA-Z]+_)*|_)"
    },
    "flanged": {
    "type": "boolean"
    },
    "version": {
    "type": "string",
    "maximum": 64,
    "minimum": 1
    },
    "colors": {
    "type": "array",
    "items": {
    "$ref": "#/definitions/color"
    }
    }
    }
    }
    },

    "anyOf": [{
    "$ref": "#/definitions/baseWidget"
    }, {
    "$ref": "#/definitions/bentWidget"
    }, {
    "$ref": "#/definitions/highPowerWidget"
    }]
    }

    关于jsonschema - JSON-Schema,基本示例未验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47314851/

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