Python 如何遍历 JSON 中的所有 description 字段?
直接遍历 newDictionary['data']['job'],在循环中读取每条记录的 description。要优先输出译文,就用 translation is None 判断是否为空;为空时输出原文 description['value']。
为什么会重复输出第一条记录?
原代码在循环开始前就读取了字段,而且索引固定为 [0]:
x = newDictionary['data']['job'][0]['description']['translation']
y = newDictionary['data']['job'][0]['description']
x 和 y 因此一直保存着第一条记录的内容。循环执行了三次,但没有通过循环变量读取其他记录。
len(newDictionary['data']['job']) 统计的是职位记录数。示例中每条记录恰好都有一个 description,所以职位记录和 description 的数量都是 3。
如何逐条读取并输出?
假设 JSON 已经解析到 newDictionary,将原来的取值和循环代码替换为:
jobs = newDictionary['data']['job']
for count, job in enumerate(jobs, start=1):
description = job['description']
translation = description.get('translation')
if translation is None:
text = description['value']
else:
text = translation
print(count, text)
print('记录数:', len(jobs))
每次循环中,job 都是当前的职位记录。enumerate(..., start=1) 同时提供从 1 开始的序号,不用再手动执行 count = count + 1。
修正示例 JSON 的字符串格式后,输出为:
1 Holland(ALPHA) is in English
2 Home" HOLLAND(H/F) in English
3 last one is english
记录数: 3
第三条记录的 translation 为 null,所以输出的是 value。
如果需要输出包含原文和译文的完整 description 对象,可以简化为:
for job in newDictionary['data']['job']:
print(job['description'])
需要注意哪些细节?
JSON 的 null 对应 Python 的 None
解析 JSON 后,判断空值应写成:
if translation is None:
'Null' 是普通字符串,不能用来判断 JSON 的空值。原代码中的 y 保存的是整个 description 字典,要读取原文还需要取其中的 value。
前面的主示例只在译文为 None 或缺少 translation 键时回退到原文。如果空字符串 "" 也表示没有译文,且该字段只可能是字符串或 null,可以改成:
text = description.get('translation') or description['value']
示例 JSON 有一处字符串未闭合
第二条记录的 translation 缺少结尾双引号,应修正为:
"translation": "Home\" HOLLAND(H/F) in English"
如果实际响应中也有这个错误,程序会在解析 JSON 时失败,无法执行后面的遍历。
解析响应时不需要额外调用 str()
requests.get(...).text 已经是字符串,可以直接传给 json.loads()。也可以用 Response.json() 解析响应:
import requests
response = requests.get('http://someapi', timeout=10)
response.raise_for_status()
newDictionary = response.json()
将占位地址替换为实际接口地址,再接上前面的循环即可。循环示例假定 data.job 是列表,每条记录的 description 都是包含 value 的字典。如果接口不保证这些字段存在,需要按实际数据约定补充检查。
备注:内容仅供参考。
