我有一个json文件,我从Web服务中提取并尝试解析它。我看到这个问题已被问了很多,我已经阅读了我能找到的任何内容,但每个例子中的json数据在本质上看起来都非常简单。同样,python文档中的json示例数据非常简单,并不反映我正在尝试使用的内容。这是json的样子:
{"RecordResponse": {
"Id": blah
"Status": {
"state": "complete",
"datetime": "2016-01-01 01:00"
},
"Results": {
"resultNumber": "500",
"Summary": [
{
"Type": "blah",
"Size": "10000000000",
"OtherStuff": {
"valueOne": "first",
"valueTwo": "second"
},
"fieldIWant": "value i want is here"
有问题的代码块是:
jsonFile = r'C:\Temp\results.json'
with open(jsonFile, 'w') as dataFile:
json_obj = json.load(dataFile)
for i in json_obj["Summary"]:
print(i["fieldIWant"])
我不仅没有进入我想要的领域,而且还在试图挑出“摘要”时遇到了一个关键错误。
我不知道索引在数组中是如何工作的;一旦我进入“摘要”字段,我是否必须手动发出索引以从我需要的字段中返回值?
答案 0 :(得分:0)
您发布的示例不是有效的JSON(对象字段后没有逗号),因此很难深入挖掘。如果它直接来自网络服务,那就搞砸了。如果您使用正确的逗号进行了修复,那么"摘要"关键在"结果"对象,因此您需要将循环更改为
with open(jsonFile, 'w') as dataFile:
json_obj = json.load(dataFile)
for i in json_obj["Results"]["Summary"]:
print(i["fieldIWant"])
如果您根本不了解结构,可以递归查看生成的对象:
def findfieldsiwant(obj, keyname="Summary", fieldname="fieldIWant"):
try:
for key,val in obj.items():
if key == keyname:
return [ d[fieldname] for d in val ]
else:
sub = findfieldsiwant(val)
if sub:
return sub
except AttributeError: #obj is not a dict
pass
#keyname not found
return None