如何检查JSON数据的完整性

时间:2016-01-17 11:06:23

标签: python json

我从API获取JSON数据,可能是收到的数据不完整(=某些字段丢失)。我不确定数据的结构是否遵循JSON标准。

第二个问题的解决方案很简单:我将try:解码JSON并根据ValueErrorTypeError例外情况采取相应行动。

对于第一个问题,我的解决方案也是

d = {'a': 1}
try:
    d['a']
    d['b']
    d['x']['shouldbethere']
except KeyError:
(...)

用于列出在成功进行JSON转换时创建的dict中需要的所有密钥。

这让我觉得可能有声明预期键的方法(可能还有值类型)并将检索到的JSON与它匹配,这是一个不成功的匹配,引发了一个特定的异常?

2 个答案:

答案 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