Python的jsonschema包是否允许使用数字键?

时间:2018-08-21 16:00:22

标签: python jsonschema

我正在提取YAML文件,并使用JSON模式对其进行验证。 YAML中的某些键是非连续数字,在YAML中表示为:

1:
    foo: bar

...在解码为Python dict时又保留了其类型。

我尝试使用JSON模式patternProperty ^\\d+$对此进行验证,但这失败了,因为正则表达式需要一个字符串,并且不执行类型强制。

在我的源YAML文件中将密钥括在引号中的时间很短,jsonschema软件包提供了一种方法来让我验证数字密钥吗?

1 个答案:

答案 0 :(得分:1)

您以错误的方式加载YAML。

有多个加载程序,除了BaseLoader之外,所有加载程序实际上都试图 通过将非标量标量与模式匹配来解释它们。然后 是为您提供1的整数,还是datetime的{​​{1}}或2018-08-21 22:10:00的布尔值:

true

给予:

import sys
import ruamel.yaml

yaml_str = """\
1: 
   foo: bar
"""

yaml = ruamel.yaml.YAML(typ='safe')
data = yaml.load(yaml_str)
print(data)

但是将{1: {'foo': 'bar'}} 更改为'safe'时:

'base'

您将获得“仅字符串”标量:

yaml = ruamel.yaml.YAML(typ='safe')

也可以使用旧语法:

{'1': {'foo': 'bar'}}

这也将与PyYAML一起使用(在调整导入之后)