gpt4 book ai didi

python - JSON 模式属性的范围比预期更广

转载 作者:行者123 更新时间:2023-11-30 22:33:08 25 4
gpt4 key购买 nike

我有以下 JSON 架构 (testschema.json),正在 Python3 中进行测试。我不断收到属性 "alpha" 的验证错误,并且我尝试以各种方式声明该属性但无济于事。

{
"id": "testschema",
"$schema": "http://json-schema.org/draft-04/schema#",
"description": "test schema",

"type": "object",
"properties": {


"traffic_parameters": {

"properties": {

"test_type": {

"type": "string",
"enum": ["AA", "BB"]
},

"capacity": {

"oneOf": [
{
"properties": {

"min_percentage": {

"type": "integer",
"minimum" : 1,
"maximum" : 150,
"additionalProperties": false
},

"max_percentage": {

"type": "integer",
"minimum" : 1,
"maximum" : 150,
"additionalProperties": false
}
},

"additionalProperties": false
},

{
"properties": {

"percentage_range": {

"type": "array",
"minItems": 1,
"maxItems": 10,
"items": {

"type": "integer"
},

"additionalProperties": false
}
},

"additionalProperties": false
}
]
}
},

"additionalProperties": false
},


"alpha": {

"properties": {

"beta": {

"oneOf": [
{
"properties": {

"AA": {

"a": [90, 95],
"b": [4, 8],
"additionalProperties": false
}
},

"additionalProperties": false
},

{
"properties": {

"BB": {

"a": [100],
"b": [0],
"c": [0],
"additionalProperties": false
}
},

"additionalProperties": false
},

{
"properties": {

"CC": {

"a": [50],
"b": [50],
"additionalProperties": false
}
},

"additionalProperties": false
},

{
"properties": {

"DD": {

"a": [0],
"b": [0],
"c": [100],
"additionalProperties": false
}
},

"additionalProperties": false
}
]
}
},

"additionalProperties": false
}
},

"required": ["traffic_parameters", "alpha"]
}

这是使用此架构的测试 JSON (test.json)。

{
"traffic_parameters": {

"test_type": "BB",

"capacity": {

"percentage_range": [1,2,3,4,5,6]
}
},

"alpha": {

"beta": "AA"
}
}

当我使用 Python3 jsonschema 模块验证这一点时

with open("testschema.json") as schema_file:
test_schema = json.load(schema_file)
schema_file.close()

with open("test.json") as json_file:
test_json = json.load(json_file)
json_file.close()

validate(test_json, test_schema)

我在 alpha 属性上收到错误,该属性的结构与 traffic_parameters 类似,但不会出错。


jsonschema.exceptions.ValidationError: 'AA' 在每个 {'properties': {'BB': ...

这是输出

E
======================================================================
ERROR: test_valid__JSON_against_schema (__main__.SchemaTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "test.py", line 35, in test_valid__JSON_against_schema
validate(test_json, test_schema)
File "/local/tools/PACKAGES/pyhton3/lib/python3.6/site-packages/jsonschema/validators.py", line 541, in validate
cls(schema, *args, **kwargs).validate(instance)
File "/local/tools/PACKAGES/pyhton3/lib/python3.6/site-packages/jsonschema/validators.py", line 130, in validate
raise error
jsonschema.exceptions.ValidationError: 'AA' is valid under each of {'properties': {'BB': {'a': [100], 'b': [0], 'c': [0], 'additionalProperties': False}}, 'additionalProperties': False}, {'properties': {'CC': {'a': [50], 'b': [50], 'additionalProperties': False}}, 'additionalProperties': False}, {'properties': {'DD': {'a': [0], 'b': [0], 'c': [100], 'additionalProperties': False}}, 'additionalProperties': False}, {'properties': {'AA': {'a': [90, 95], 'b': [4, 8], 'additionalProperties': False}}, 'additionalProperties': False}

Failed validating 'oneOf' in schema['properties']['alpha']['properties']['beta']:
{'oneOf': [{'additionalProperties': False,
'properties': {'AA': {'a': [90, 95],
'additionalProperties': False,
'b': [4, 8]}}},
{'additionalProperties': False,
'properties': {'BB': {'a': [100],
'additionalProperties': False,
'b': [0],
'c': [0]}}},
{'additionalProperties': False,
'properties': {'CC': {'a': [50],
'additionalProperties': False,
'b': [50]}}},
{'additionalProperties': False,
'properties': {'DD': {'a': [0],
'additionalProperties': False,
'b': [0],
'c': [100]}}}]}

On instance['alpha']['beta']:
'AA'

----------------------------------------------------------------------
Ran 1 test in 0.007s

FAILED (errors=1)

有谁知道这是为什么以及如何解决它?

谢谢。

最佳答案

我将把架构缩短到足以重现验证失败的程度:

{
"id": "testschema",
"$schema": "http://json-schema.org/draft-04/schema#",
"description": "test schema",
"type": "object",
"properties": {
"alpha": {
"properties": {
"beta": {
"oneOf": [
{
"properties": {
"AA": {
"a": [90, 95],
"b": [4, 8],
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"properties": {
"BB": {
"a": [100],
"b": [0],
"c": [0],
"additionalProperties": false
}
},
"additionalProperties": false
}
]
}
},
"additionalProperties": false
}
},
"required": [ "alpha" ]
}

该错误表示验证 oneOf 约束失败,因为 "AA" 已针对 oneOf 中列出的每个架构成功验证,并且oneOf 要求它必须匹配一个且仅一个。

为什么“AA”针对每个架构进行验证?根本原因是模式没有为 oneOf 中列出的每个模式指定 "type" 信息。正如所解释的here ,如果没有为架构指定 "type",则任何类型的任何有效 JSON 都可能与该架构匹配。为了解决这个问题,我们需要添加缺少的“type”约束。

通过查看架构和 JSON 示例,我不确定您想要实现什么。该架构似乎将 "AA""BB" 等描述为嵌套对象,但 JSON 示例似乎显示 "beta" 只需映射到一个字符串值,如 "AA"

如果 JSON 示例是正确的信息源,您可以使用这样的架构解决问题。

schema = json.loads('''
{
"id": "testschema",
"$schema": "http://json-schema.org/draft-04/schema#",
"description": "test schema",
"type": "object",
"properties": {
"alpha": {
"type": "object",
"properties": {
"beta": {
"type": "string",
"enum": [ "AA", "BB", "CC", "DD" ]
}
},
"additionalProperties": false
}
},
"required": [ "alpha" ]
}
''')

# valid
validate(json.loads('''
{
"alpha": {
"beta": "AA"
}
}
'''), schema)

# valid
validate(json.loads('''
{
"alpha": {
"beta": "BB"
}
}
'''), schema)

# invalid
validate(json.loads('''
{
"alpha": {
"beta": "ZZ"
}
}
'''), schema)

Traceback (most recent call last):
File "<stdin>", line 7, in <module>
File "/Library/Python/2.7/site-packages/jsonschema/validators.py", line 541, in validate
cls(schema, *args, **kwargs).validate(instance)
File "/Library/Python/2.7/site-packages/jsonschema/validators.py", line 130, in validate
raise error
jsonschema.exceptions.ValidationError: u'ZZ' is not one of [u'AA', u'BB', u'CC', u'DD']

Failed validating u'enum' in schema[u'properties'][u'alpha'][u'properties'][u'beta']:
{u'enum': [u'AA', u'BB', u'CC', u'DD'], u'type': u'string'}

On instance[u'alpha'][u'beta']:
u'ZZ'

OTOH,如果您的目标是让 "AA""BB" 等成为子对象,那么您可以通过将架构更改为来修复它像这样的东西。

schema = json.loads('''
{
"id": "testschema",
"$schema": "http://json-schema.org/draft-04/schema#",
"description": "test schema",
"type": "object",
"properties": {
"alpha": {
"type": "object",
"properties": {
"beta": {
"oneOf": [
{
"type": "object",
"properties": {
"AA": {
"type": "object",
"properties": {
"a": {
"type": "array"
}
}
}
},
"additionalProperties": false
},
{
"type": "object",
"properties": {
"BB": {
"type": "object",
"properties": {
"b": {
"type": "array"
}
}
}
},
"additionalProperties": false
}
]
}
},
"additionalProperties": false
}
},
"required": [ "alpha" ]
}
''')

# valid
validate(json.loads('''
{
"alpha": {
"beta": {
"AA": {
"a": [ 1 ]
}
}
}
}
'''), schema)

# valid
validate(json.loads('''
{
"alpha": {
"beta": {
"BB": {
"b": [ 1 ]
}
}
}
}
'''), schema)

# invalid
validate(json.loads('''
{
"alpha": {
"beta": {
"ZZ": {
"z": [ 1 ]
}
}
}
}
'''), schema)
Traceback (most recent call last):
File "<stdin>", line 11, in <module>
File "/Library/Python/2.7/site-packages/jsonschema/validators.py", line 541, in validate
cls(schema, *args, **kwargs).validate(instance)
File "/Library/Python/2.7/site-packages/jsonschema/validators.py", line 130, in validate
raise error
jsonschema.exceptions.ValidationError: {u'ZZ': {u'z': [1]}} is not valid under any of the given schemas

Failed validating u'oneOf' in schema[u'properties'][u'alpha'][u'properties'][u'beta']:
{u'oneOf': [{u'additionalProperties': False,
u'properties': {u'AA': {u'properties': {u'a': {u'type': u'array'}},
u'type': u'object'}},
u'type': u'object'},
{u'additionalProperties': False,
u'properties': {u'BB': {u'properties': {u'b': {u'type': u'array'}},
u'type': u'object'}},
u'type': u'object'}]}

On instance[u'alpha'][u'beta']:
{u'ZZ': {u'z': [1]}}

# invalid
validate(json.loads('''
{
"alpha": {
"beta": {
"AA": {
"a": [ 1 ]
},
"BB": {
"b": [ 1 ]
}
}
}
}
'''), schema)

Traceback (most recent call last):
File "<stdin>", line 14, in <module>
File "/Library/Python/2.7/site-packages/jsonschema/validators.py", line 541, in validate
cls(schema, *args, **kwargs).validate(instance)
File "/Library/Python/2.7/site-packages/jsonschema/validators.py", line 130, in validate
raise error
jsonschema.exceptions.ValidationError: {u'AA': {u'a': [1]}, u'BB': {u'b': [1]}} is not valid under any of the given schemas

Failed validating u'oneOf' in schema[u'properties'][u'alpha'][u'properties'][u'beta']:
{u'oneOf': [{u'additionalProperties': False,
u'properties': {u'AA': {u'properties': {u'a': {u'type': u'array'}},
u'type': u'object'}},
u'type': u'object'},
{u'additionalProperties': False,
u'properties': {u'BB': {u'properties': {u'b': {u'type': u'array'}},
u'type': u'object'}},
u'type': u'object'}]}

On instance[u'alpha'][u'beta']:
{u'AA': {u'a': [1]}, u'BB': {u'b': [1]}}

无论哪种方式,重要的是确保在必要时指定“type”信息。

关于python - JSON 模式属性的范围比预期更广,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45239993/

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