检查键是否存在并使用Python遍历JSON数组

191 投票
7 回答
510045 浏览
提问于 2025-04-18 14:21

我有一堆来自Facebook帖子的数据,格式是JSON,像下面这个:

{"from": {"id": "8", "name": "Mary Pinter"}, "message": "How ARE you?", "comments": {"count": 0}, "updated_time": "2012-05-01", "created_time": "2012-05-01", "to": {"data": [{"id": "1543", "name": "Honey Pinter"}]}, "type": "status", "id": "id_7"}

这些JSON数据是半结构化的,也就是说它们的格式不完全一样。
下面是我的代码:

import json 

str = '{"from": {"id": "8", "name": "Mary Pinter"}, "message": "How ARE you?", "comments": {"count": 0}, "updated_time": "2012-05-01", "created_time": "2012-05-01", "to": {"data": [{"id": "1543", "name": "Honey Pinter"}]}, "type": "status", "id": "id_7"}'
data = json.loads(str)

post_id = data['id']
post_type = data['type']
print(post_id)
print(post_type)

created_time = data['created_time']
updated_time = data['updated_time']
print(created_time)
print(updated_time)

if data.get('application'):
    app_id = data['application'].get('id', 0)
    print(app_id)
else:
    print('null')

#if data.get('to'):
#... This is the part I am not sure how to do
# Since it is in the form "to": {"data":[{"id":...}]}

我想让代码打印出to_id的值,如果没有这个值,就打印'null'。
我不太确定该怎么做。

7 个回答

7

我写了一个小函数来实现这个目的。你可以随意使用它,

def is_json_key_present(json, key):
    try:
        buf = json[key]
    except KeyError:
        return False

    return True
19

当然可以!请看下面的内容:

在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后把它放到另一个地方。这就像你从冰箱拿出食材,然后把它放到锅里做饭一样。

有些时候,数据的格式可能会不太一样,就像你有一个圆形的盘子和一个方形的盒子,你需要想办法把食材从一个形状转移到另一个形状。这个过程就叫做“转换”。

在代码中,我们可以使用一些工具或者函数来帮助我们完成这个转换的工作。就像厨房里有刀、锅、铲子等工具,编程里也有很多现成的函数可以使用。

总之,处理数据就像做饭一样,需要把不同的材料(数据)放在一起,经过一些处理(转换),最后才能做出美味的菜肴(结果)。

希望这个解释能够帮助你更好地理解这个概念!

if "my_data" in my_json_data:
         print json.dumps(my_json_data["my_data"])
26

创建一些辅助工具方法是个好习惯,这样每当你需要修改属性验证的逻辑时,只需在一个地方进行更改,代码也会更容易让后面的人理解。

比如,你可以在 json_utils.py 文件中创建一个辅助方法(或者一个名为 JsonUtils 的类,里面有静态方法):

def get_attribute(data, attribute, default_value):
    return data.get(attribute) or default_value

然后在你的项目中使用它:

from json_utils import get_attribute

def my_cool_iteration_func(data):

    data_to = get_attribute(data, 'to', None)
    if not data_to:
        return

    data_to_data = get_attribute(data_to, 'data', [])
    for item in data_to_data:
        print('The id is: %s' % get_attribute(item, 'id', 'null'))

重要提示:

我使用 data.get(attribute) or default_value 而不是简单的 data.get(attribute, default_value) 是有原因的:

{'my_key': None}.get('my_key', 'nothing') # returns None
{'my_key': None}.get('my_key') or 'nothing' # returns 'nothing'

在我的应用中,获取到值为 'null' 的属性和根本没有获取到这个属性是一样的。如果你的使用情况不同,那你需要对此进行调整。

154

如果你只是想检查某个键是否存在

h = {'a': 1}
'b' in h # returns False

如果你想检查某个键是否有对应的值

h.get('b') # returns None

如果实际值缺失,可以返回一个默认值

h.get('b', 'Default value')
215
import json

jsonData = """{"from": {"id": "8", "name": "Mary Pinter"}, "message": "How ARE you?", "comments": {"count": 0}, "updated_time": "2012-05-01", "created_time": "2012-05-01", "to": {"data": [{"id": "1543", "name": "Honey Pinter"}]}, "type": "status", "id": "id_7"}"""

def getTargetIds(jsonData):
    data = json.loads(jsonData)
    if 'to' not in data:
        raise ValueError("No target in given data")
    if 'data' not in data['to']:
        raise ValueError("No data for target")

    for dest in data['to']['data']:
        if 'id' not in dest:
            continue
        targetId = dest['id']
        print("to_id:", targetId)

输出结果:

In [9]: getTargetIds(s)
to_id: 1543

撰写回答