在Python中列出json中的索引

时间:2016-05-02 18:47:44

标签: python json

我有一个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"])

我不仅没有进入我想要的领域,而且还在试图挑出“摘要”时遇到了一个关键错误。

我不知道索引在数组中是如何工作的;一旦我进入“摘要”字段,我是否必须手动发出索引以从我需要的字段中返回值?

1 个答案:

答案 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