如何在Python中解析空的JSON属性/元素

时间:2016-06-24 03:07:51

标签: python json parsing null

我正在尝试解析我从RESTful API接收的一些JSON,但是我在使用Python访问数据时遇到了问题,因为它似乎有一个空的属性名称。

返回了JSON的示例:

{
  "extractorData" : {
"url" : "RetreivedDataURL",
"resourceId" : "e38e1a7dd8f23dffbc77baf2d14ee500",
"data" : [ {
  "group" : [ {
    "CaseNumber" : [ {
      "text" : "PO-1994-1350",
      "href" : "http://www.referenceURL.net"
    } ],
    "DateFiled" : [ {
      "text" : "03/11/1994"
    } ],
    "CaseDescription" : [ {
      "text" : "Mary v. JONES"
    } ],
    "FoundParty" : [ {
      "text" : "Lastname, MARY BETH (Plaintiff)"
    } ]
  }, {
    "CaseNumber" : [ {
      "text" : "NP-1998-2194",
      "href" : "http://www.referenceURL.net"
    }, {
      "text" : "FD-1998-2310",
      "href" : "http://www.referenceURL.net"
    } ],
    "DateFiled" : [ {
      "text" : "08/13/1993"
    }, {
      "text" : "06/02/1998"
    } ],
    "CaseDescription" : [ {
      "text" : "IN RE: NOTARY PUBLIC VS REDACTED"
    }, {
      "text" : "REDACTED"
    } ],
    "FoundParty" : [ {
      "text" : "Lastname, MARY H (Plaintiff)"
    }, {
      "text" : "Lastname, MARY BETH (Defendant)"
    } ]
  } ]
} ]

我试图使用的Python代码

import requests
import json

FirstName = raw_input("Please Enter First name: ")
LastName = raw_input("Please Enter Last Name: ")


with requests.Session() as c:
url = ('https://www.requestURL.net/?name={}&lastname={}').format(LastName, FirstName)
page = c.get(url)
data = page.content

theJSON = json.loads(data)

def myprint(d):
stack = d.items()
while stack:
    k, v = stack.pop()
    if isinstance(v, dict):
        stack.extend(v.iteritems())
    else:
        print("%s: %s" % (k, v))

print myprint(theJSON["extractorData"]["data"]["group"])

我收到错误:

TypeError: list indices must be integers, not str

我是解剖Python的新手,而不仅仅是简单的python,所以请原谅我的无知。但是让我相信它是一个空的属性是因为当我使用工具在线观看JSON时,我得到空括号,如下所示:

printscreen http://image.prntscr.com/image/6f8a8e4a1b8742d081bff024207d6426.png

将这些数据解析为文本的任何帮助都会有很大帮助。

编辑:现在我可以使用以下代码引用某个节点:

for d in group:
print group[0]['CaseNumber'][0]["text"]

但是现在我如何迭代group属性中列出的所有字典以列出标记为" CaseNumber"的所有节点。因为它应该存在于每一个中。例如

print group[0]['CaseNumber'][0]["text"]

然后

for d in group:
print group[1]['CaseNumber'][0]["text"]

依此类推。也许递增某种整数直到它结束?我不太确定。

1 个答案:

答案 0 :(得分:1)

如果仔细查看json,您正在访问的data密钥实际上是一个列表,但是data['group']正试图访问它,就像它是一个字典一样,这会引发TypeError。 / p>

要缩小你的json,就像这样

{
    "extractorData": {
        "url": "string",
        "resourceId": "string",
        "data": [{
            "group": []
        }]
    }
}

因此,如果您想访问组,则应首先检索data这是一个列表。

data = sample['extractorData']['data']

然后您可以迭代data并在其中获取group

for d in data:
    group = d['group']

我希望这能为你澄清一些事情。