【问题标题】:How to parse empty JSON property/element in Python如何在 Python 中解析空的 JSON 属性/元素
【发布时间】:2016-06-24 03:07:51
【问题描述】:

我正在尝试解析我从 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 时,我得到空括号,就像这样:

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

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

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"]

等等等等。也许增加某种整数直到它到达末尾?我不太确定。

【问题讨论】:

    标签: python json parsing null


    【解决方案1】:

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

    要缩小你的 json,它是这样的

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

    所以如果你想访问组,你应该首先检索data,这是一个列表。

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

    然后您可以遍历 data 并在其中获取 group

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

    我希望这可以为您澄清一点。

    【讨论】:

    • 这有点帮助。我能够检索“组”的内容。我相信您的意思是在第二个代码块中的“数据”一词之后加上一个结束引号,否则它会引发错误。我仍然对 for 循环到底在做什么感到有点困惑。 “组”作为 python 字典返回(或至少看起来是),但我仍然无法访问各个属性。例如: {u'CaseDescription': [{u'text': u'NAME'}] 我的理解是文本 u'CaseDescription' 应该是引用它的键名,但它似乎不起作用。跨度>
    • @HunterBeach, data 实际上是一个字典列表
    • @HunterBeach 我的措辞有点不恰当,Jordan 的编辑更清楚地说明了这一点。如果您仍然感到困惑,您可以使用您现在尝试实现目标的代码来更新您的问题
    • @RajeshYogeshwar 我更新了它以反映我现在使用的代码。我觉得这应该很容易解决,但我不确定如何解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 2013-08-14
    相关资源
    最近更新 更多