JSON整型属性可以引用吗?
Can JSON integer attributes be referenced?
我有以下要验证的 JSON 架构和 Python 单元测试。
{
"properties": {
"traffic_parameters" {
"capacity": {
"oneOf": [
{
"max_percentage": {
"type": "integer",
"minimum" : 1,
"maximum" : 150
},
"min_percentage": {
"type": "integer",
"minimum" : 1,
"maximum" : {
"$ref": "#/properties/traffic_parameters/capacity/oneOf/max_percentage/minimum"
}
}
},
{
"percentage_range": {
"type": "array",
"minItems": 1,
"maxItems": 10,
"items": {
"type": "integer"
}
}
}
]
}
}
}
}
我使用 jsonschema 验证了整个模式文件是否正常。
但是,在编写单元测试时出现以下错误;
capacity = {'oneOf': [{'max_percentage': {'type': 'integer', 'minimum': 1, 'maximum': 150}, 'min_percentage': {'type': 'integer', 'minimum': 1, 'maximum': {'$ref': '#/properties/traffic_parameters/capacity/oneOf/max_percentage/minimum'}}}, {'percentage_range': {'type': 'array', 'minItems': 1, 'maxItems': 10, 'items': {'type': 'integer'}}}]}
-----------------------------------------
index0 = {'max_percentage': {'type': 'integer', 'minimum': 1, 'maximum': 150}, 'min_percentage': {'type': 'integer', 'minimum': 1, 'maximum': {'$ref': '#/properties/traffic_parameters/capacity/oneOf/max_percentage/minimum'}}}
-----------------------------------------
min_percentage = {'type': 'integer', 'minimum': 1, 'maximum': {'$ref': '#/properties/traffic_parameters/capacity/oneOf/max_percentage/minimum'}}
E.........
======================================================================
ERROR: test_invalid_minimum__traffic_parameters__capacity__min_percentage (__main__.SchemaTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "test_test-variables_schema.py", line 160, in test_invalid_minimum__traffic_parameters__capacity__min_percentage
validate(0, min_percentage)
File "/local/tools/PACKAGES/python3/lib/python3.6/site-packages/jsonschema/validators.py", line 540, in validate
cls.check_schema(schema)
File "/local/tools/PACKAGES/python3/lib/python3.6/site-packages/jsonschema/validators.py", line 83, in check_schema
raise SchemaError.create_from(error)
jsonschema.exceptions.SchemaError: {'$ref': '#/properties/traffic_parameters/capacity/oneOf/max_percentage/minimum'} is not of type 'number'
Failed validating 'type' in schema['properties']['maximum']:
{'type': 'number'}
On instance['maximum']:
{'$ref': '#/properties/traffic_parameters/capacity/oneOf/max_percentage/minimum'}
FAILED (errors=1)
我的测试是 Python 测试属性最小值和最大值的单元测试。最大值是对上面直接定义的另一个属性的引用。
显示的测试测试的是最小值,但错误的是最大值。如果我正在测试最大值,错误将是相同的,这正是我正在做的。
我尝试将 "maximum" 的类型重新指定为 "integer",但错误仍然存在。
如何在不更改属性类型的情况下解决此错误?参考很重要,因为我希望这个属性的最大值与前一个属性的最小值直接相关。
此外,是否有另一种(更简单的)方法在单元测试中引用这些变量?
这是函数
def test_invalid_minimum__traffic_parameters__capacity__min_percentage(self):
global test_schema
capacity = test_schema["traffic_parameters"]["capacity"]
print ("capacity = " + str(capacity))
print ("-----------------------------------------")
index0 = capacity["oneOf"][0]
print ("index0 = " + str(index0))
print ("-----------------------------------------")
min_percentage = index0["min_percentage"]
print ("min_percentage = " + str(min_percentage))
with self.assertRaises(ValidationError ):
validate(0, min_percentage)
谢谢。
JSON 参考规范没有对 $ref
的内容设置任何限制,但在实践中,我见过的任何验证器都只支持 $ref
s指向 JSON 架构。我不确定为什么 none 曾经支持该功能,但我还没有看到我认为这样做是个好主意的案例。
在最近发布的 JSON Schema draft-06 中,仅支持 JSON Schemas 的常见做法成为了规则。所以,即使你确实找到了支持 $ref
ing 整数的验证器,我也不建议使用它,因为它会使将来更难升级。
这样不行。 $ref
引用必须始终指向模式。所以它可以是对象或布尔值,但不能是数字。
我有以下要验证的 JSON 架构和 Python 单元测试。
{
"properties": {
"traffic_parameters" {
"capacity": {
"oneOf": [
{
"max_percentage": {
"type": "integer",
"minimum" : 1,
"maximum" : 150
},
"min_percentage": {
"type": "integer",
"minimum" : 1,
"maximum" : {
"$ref": "#/properties/traffic_parameters/capacity/oneOf/max_percentage/minimum"
}
}
},
{
"percentage_range": {
"type": "array",
"minItems": 1,
"maxItems": 10,
"items": {
"type": "integer"
}
}
}
]
}
}
}
}
我使用 jsonschema 验证了整个模式文件是否正常。 但是,在编写单元测试时出现以下错误;
capacity = {'oneOf': [{'max_percentage': {'type': 'integer', 'minimum': 1, 'maximum': 150}, 'min_percentage': {'type': 'integer', 'minimum': 1, 'maximum': {'$ref': '#/properties/traffic_parameters/capacity/oneOf/max_percentage/minimum'}}}, {'percentage_range': {'type': 'array', 'minItems': 1, 'maxItems': 10, 'items': {'type': 'integer'}}}]}
-----------------------------------------
index0 = {'max_percentage': {'type': 'integer', 'minimum': 1, 'maximum': 150}, 'min_percentage': {'type': 'integer', 'minimum': 1, 'maximum': {'$ref': '#/properties/traffic_parameters/capacity/oneOf/max_percentage/minimum'}}}
-----------------------------------------
min_percentage = {'type': 'integer', 'minimum': 1, 'maximum': {'$ref': '#/properties/traffic_parameters/capacity/oneOf/max_percentage/minimum'}}
E.........
======================================================================
ERROR: test_invalid_minimum__traffic_parameters__capacity__min_percentage (__main__.SchemaTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "test_test-variables_schema.py", line 160, in test_invalid_minimum__traffic_parameters__capacity__min_percentage
validate(0, min_percentage)
File "/local/tools/PACKAGES/python3/lib/python3.6/site-packages/jsonschema/validators.py", line 540, in validate
cls.check_schema(schema)
File "/local/tools/PACKAGES/python3/lib/python3.6/site-packages/jsonschema/validators.py", line 83, in check_schema
raise SchemaError.create_from(error)
jsonschema.exceptions.SchemaError: {'$ref': '#/properties/traffic_parameters/capacity/oneOf/max_percentage/minimum'} is not of type 'number'
Failed validating 'type' in schema['properties']['maximum']:
{'type': 'number'}
On instance['maximum']:
{'$ref': '#/properties/traffic_parameters/capacity/oneOf/max_percentage/minimum'}
FAILED (errors=1)
我的测试是 Python 测试属性最小值和最大值的单元测试。最大值是对上面直接定义的另一个属性的引用。
显示的测试测试的是最小值,但错误的是最大值。如果我正在测试最大值,错误将是相同的,这正是我正在做的。
我尝试将 "maximum" 的类型重新指定为 "integer",但错误仍然存在。
如何在不更改属性类型的情况下解决此错误?参考很重要,因为我希望这个属性的最大值与前一个属性的最小值直接相关。
此外,是否有另一种(更简单的)方法在单元测试中引用这些变量?
这是函数
def test_invalid_minimum__traffic_parameters__capacity__min_percentage(self):
global test_schema
capacity = test_schema["traffic_parameters"]["capacity"]
print ("capacity = " + str(capacity))
print ("-----------------------------------------")
index0 = capacity["oneOf"][0]
print ("index0 = " + str(index0))
print ("-----------------------------------------")
min_percentage = index0["min_percentage"]
print ("min_percentage = " + str(min_percentage))
with self.assertRaises(ValidationError ):
validate(0, min_percentage)
谢谢。
JSON 参考规范没有对 $ref
的内容设置任何限制,但在实践中,我见过的任何验证器都只支持 $ref
s指向 JSON 架构。我不确定为什么 none 曾经支持该功能,但我还没有看到我认为这样做是个好主意的案例。
在最近发布的 JSON Schema draft-06 中,仅支持 JSON Schemas 的常见做法成为了规则。所以,即使你确实找到了支持 $ref
ing 整数的验证器,我也不建议使用它,因为它会使将来更难升级。
这样不行。 $ref
引用必须始终指向模式。所以它可以是对象或布尔值,但不能是数字。