使用python从嵌套Json获取所需数据

使用python从嵌套Json获取所需数据,python,json,python-3.x,Python,Json,Python 3.x,我有一个嵌套的JSON,如下所示: { "ok": true, "messages": [ { "bot_id": "G45667S9F", "type": "message", "text": "garbage123", "user": "SDFGHJ123", "ts": "1555007738.345800" }, { "client_msg_id": "xxxxxxxx

我有一个嵌套的JSON,如下所示:

{
"ok": true,
"messages": [
    {
        "bot_id": "G45667S9F",
        "type": "message",
        "text": "garbage123",
        "user": "SDFGHJ123",
        "ts": "1555007738.345800"
    },
    {
        "client_msg_id": "xxxxxxxxxxxxxxxxxxx",
        "type": "message",
        "text": "completed task123",
        "user": "SDFGHJ123",
        "ts": "1555007735.345700"
    },
    {
        "client_msg_id": "xxxxxxxxxxxxxxxxxxx",
        "type": "message",
        "text": "sdfghnjmxcvbnmsd",
        "user": "SDFGHJ123",
        "ts": "1555007721.345500"
    },
    {
        "bot_id": "G45667S9F",
        "type": "message",
        "text": "garbage123",
        "user": "SDFGHJ123",
        "ts": "1555007451.345300"
    },
    {
        "client_msg_id": "xxxxxxxxxxxxxxxxxxx",
        "type": "message",
        "text": "starting task123",
        "user": "SDFGHJ123",
        "ts": "1555007449.345200"
    },
    {
        "bot_id": "G45667S9F",
        "type": "message",
        "text": "garbage123",
        "user": "SDFGHJ123",
        "ts": "1554960212.319800"
    }
],
"has_more": true
}
我想提取所有具有关键字“client\u msg\u id”的文本字段,但不提取具有“bot\u id”的文本字段

预期输出:[“已完成任务123”、“sdfghnjmxcvbnmsd”、“正在启动任务123”]

下面是我试过的

text1 = json.loads(r1.data)
object_list = text1['messages']
chill = [obj['text'] for obj in object_list]
print(chill)

这将打印JSON中的所有文本字段。

您可以在列表末尾添加和
条件,如下所示:

[obj['text'] for obj in text1['messages'] if 'bot_id' not in obj.keys()]

使用它来测试结果列表中应该包含的项目。

只需检查
'client\u msg\u id'
是否在
obj
字典键中

chill = [obj['text'] for obj in object_list if 'client_msg_id' in obj]

假设字典分配给
数据
,您可以这样做

valid = [message['text'] for message in data['messages'] if "client_msg_id" in message and 'bot_id' not in message]
print(valid)
#['completed task123', 'sdfghnjmxcvbnmsd', 'starting task123']

在这里,您遍历所有消息,对于具有key
client\u msg\u id
但没有key
bot\u id

的消息,只读取key
text
的值,这给出了完全错误的输出
['garbage123','garbage123','garbage123']
抱歉-
不在
中注意:不需要在obj.keys()中使用
就足够了,在python 2中使用
keys()
会大大降低性能。不要用它。这篇文章经过编辑。这个问题专门用Python3,FWIW标记