我从API获取JSON数据,可能是收到的数据不完整(=某些字段丢失)。我不确定数据的结构是否遵循JSON标准。
第二个问题的解决方案很简单:我将try:
解码JSON并根据ValueError
和TypeError
例外情况采取相应行动。
对于第一个问题,我的解决方案也是
d = {'a': 1}
try:
d['a']
d['b']
d['x']['shouldbethere']
except KeyError:
(...)
用于列出在成功进行JSON转换时创建的dict
中需要的所有密钥。
这让我觉得可能有声明预期键的方法(可能还有值类型)并将检索到的JSON与它匹配,这是一个不成功的匹配,引发了一个特定的异常?
答案 0 :(得分:3)
验证JSON结构的标准方法是使用JSON Schema。 基本特征(引自官方网页)是:
JSON架构:
- 描述了您现有的数据格式
- 清晰,人性化和机器可读的文档
- 完整的结构验证,非常有用
- 自动化测试
- 验证客户提交的数据
虽然您可以使用pypi中的jsonschema,但没有内置程序包可以根据架构验证JSON对象。
样本用法(从官方文档中解释)可能是:
import jsonschema
schema = {
"type": "object",
"properties": {
"price": {"type": "number"},
"name": {"type": "string"},
},
}
jsonschema.validate({"name": "Eggs", "price": 34.99}, schema)
# No exception from line above - document is valid
jsonschema.validate({"name": "Eggs", "price": "Invalid"}, schema)
# ValidationError: 'Invalid' is not of type 'number'
答案 1 :(得分:-1)
JSON解析器不容易用于纠错,所以如果数据不是JSON,我认为应用任何类型的自动更正来解析它是非常困难的,所以你对无效JSON的解决方案可能是最合理的决定。
验证dict包含特定键集的函数相对容易实现。我不知道有任何JSON对象方法来执行该测试,但是给定一个JSON对象j
,您可以按如下方式检查它(检查它是否为dict也是明智的,因为JSON对象也可以是其他类型):
def has_all_keys(j, keylist):
return all(key in j for key in keylist)
使用此交互式建议可能有效(在此示例中,我依赖于对字符串的迭代产生单个字符的事实,但显然您将需要一个真实的字符串键值列表)。
>>> has_all_keys({}, "abc")
False
>>> has_all_keys({'a':1, 'b':1, 'c':1}, "abc")
True