检查json数据中所有字段的最佳方法?

时间:2016-08-23 12:12:35

标签: python json list dictionary data-structures

data = {u'name': None, u'region': None, u'id': u'test1', u'code': None,
        u'city': None, u'first_name': None, u'state_or_province': None,
        u'primary_phone': None, u'data2': [{u'status': u'deleted', u'name':
        u'b1', u'id': u'b1', u'modified_at': u'2016-07-13T10:22:47Z', u'eid':
        u'0012340', u'device_type': u'Mad box', u'custom_data': None,
        u'is_managed': True, u'number': None, u'sms_id': u'sms1'}],
        u'secondary_phone': None, u'sms_id': u'sms1', u'status': u'deleted',
        u'users': [{u'allow_content': False, u'status': u'deleted',
        u'sign_in_count': 0, u'max1': {u'TV': u'TV-MA', u'MPAA': u'NC-17',
        u'Unrated': u'UR'}, u'name': u'', u'subscriber_id': u'b1', u'gender':
        None, u'ids': [], u'modified_at': u'2016-07-27T10:18:19Z',
        u'allow_adult_content': False, u'sharing_threshold': {}, u'custom_data':
        None, u'user_id': u'test@test.com', u'email': None, u'sms_id': u'sms1'},
        {u'allow_unrated_content': None, u'status': u'deleted', u'sign_in_count':
        0, u'max_rating': {}, u'name': None, u'subscriber_id': u'testsub1',
        u'gender': None, u'offer_uri_ids': [], u'modified_at':
        u'2016-07-13T10:13:32Z', u'allow_adult_content': None,
        u'sharing_threshold': {}, u'custom_data': None, u'user_id': u'test',
        u'email': u'asdf@god.com', u'sms_id': u'sms1'}], u'ref':
        u'test@test.com', u'pin_code': None, u'credit_limit': 100.0,
        u'expiration': None, u'country': None, u'modified_at':
        u'2016-07-27T10:18:19Z', u'last_change_date': None, u'custom_data': None,
        u'address_line_1': None, u'address_line_2': None, u'change_id': None,
        u'billing_codes': []}

我需要验证空数据的所有密钥和值。 试过if/else,但这需要太多代码。寻找更好的方法比 以下内容:

parsed_json = [data]

if 'name' not in parsed_json[0]:
   print "name is not present"
if parsed_json[0]['name'] is "":
  print "name value is empty"
if 'region' not in parsed_json[0]:
  print "region is not present"
if parsed_json[0]['region'] is ""
  print "region value is empty"

3 个答案:

答案 0 :(得分:1)

Python 3.x代码:

for key, value in parsed_json[0].items():
  if value == "":
    print(key + " value is empty.")

注意:此代码不会按密钥区分错误消息(每个消息都会收到相同的错误消息)并且未正确转义。如果您从不受信任的来源获取此数据(专业提示,它们都是不受信任的来源),您应该有错误捕获/处理来解释丢失/损坏的密钥名称。

答案 1 :(得分:1)

要获取仅包含空值的过滤字典,您可以执行以下操作:

Python 2.x

empty_values = {k:v代表k,v代表data.iteritems(),如果不是v}

Python 3.x

empty_values = {k:v代表k,v代表data.items(),如果不是v}

答案 2 :(得分:1)

由于JSON对象是一个递归数据结构,可能是递归执行所需操作的最简单方法:

def verify(key, value):
    if not value:
        print('"{}" is not present'.format(key))
    elif isinstance(value, dict):
        for k, v in value.items():
            verify(k, v)
    elif isinstance(value, list):
        for i, element in enumerate(value):
            verify('{}[{}]'.format(key, i), element)

parsed_json = [data]

verify('parsed_json', parsed_json[0])

注意:这会将00.0等数值视为不存在。如果那不是你想要的,你需要检查这些类型并相应地修改第一个if