Python 解析 Json - "X is None" 不捕获空对象

Python parsing Json - "X is None" doesn't catch empty objects

我是 Python 的新手,我正在尝试使用 Python 解析 Json 文件。 Json 文件是嵌套文件。当我尝试精确 "conversation_id" 项目时,包含该项目的列表以及上面的列表有时可能是空的。我希望将空列表替换为字符串 "N/A",否则获取该项目。我使用的代码如下:

for log in data['logs']:
    print("Processing log "+log['log_id'])

    logcolumns=[]

    if log['request'] is None:
            logcolumns.append("N/A")
    elif log['request']['context'] is None:
           logcolumns.append("N/A")
    else:
        logcolumns.append(log['request']['context']['conversation_id'])
try:
        print("\t".join(logcolumns),file = conv_tsv)
    except KeyError:pass

del logcolumns

我得到的回溯错误是

Processing log cafa1077-f479-4c55-ac34-3bc3ebbb41fc
Traceback (most recent call last):
  File "conversation_log_2.py", line 43, in <module>
    logcolumns.append(log['request']['context']['conversation_id'])
KeyError: 'conversation_id'

与此日志 ID 关联的 "request" 列表在 json 文件中如下所示:

{"request": {"input": {}, "context": {}},

完整的请求列表如下:

{"request": {"input": {"text": "haha"}, "context": {"conversation_id": "328d2320-f488-4f46-b71f-6cdfb1b79106", "system": {"dialog_stack": [{"dialog_node_s": "root"}], "dialog_turn_counter": 1, "dialog_request_counter": 1, "_node_output_map_s": "{\"Welcome\":[0,1,0]}", "branch_exited_s": "true", "branch_exited_reason_s": "completed"}}}, 

当我转到输出文件 conv.tsv 时,输出中有 N/A

你的语法似乎很混乱。 try/except 应该包裹 if/elif 吗?你真的想要 if/elif 吗?

请注意 log['request'] is None 不会测试键值是否为空字典。

您可以使用 .get 方法,当找不到密钥时 returns 默认值:

logcolumns.append(log.get('request', {}).get('context', {}).get('conversation', 'N/A'))

或者更好的是,如果缺少任何键,请使用 try/except 附加默认值:

try:
    logcolumns.append(log['request']['context']['conversation_id'])
except KeyError:
    logcolumns.append('N/A')