【问题标题】:What Am I Missing When Parsing this JSON Output解析此 JSON 输出时我遗漏了什么
【发布时间】:2016-07-01 18:01:52
【问题描述】:

尝试使用 Python 解析此 JSON 输出时,我遗漏了什么? JSON 看起来像这样:

    {
  "start": 0,
  "terms": [
    "process_name:egagent.exe"
  ],
  "highlights": [],
  "total_results": 448,
  "filtered": {},
  "facets": {},
  "results": [
    {
      "username": "SYSTEM",
      "alert_type": "test"
    },
    {
      "username": "SYSTEM2",
      "alert_type": "test"
    }
   ]
  }

我试图用来访问它的 Python 很简单。我想获取用户名,但我尝试的一切都会引发错误。当它不抛出错误时,我似乎得到了每个人的信。所以,如果我这样做:

apirequest = requests.get(requesturl, headers=headers, verify=False)
readable = json.loads(apirequest.content)

#print readable
for i in readable:
    print (i[0])

我得到 s, t, h, t, f, f, r,它们是每个项目的第一个字母。如果我尝试 i[1],我会得到每个项目的第二个字母。当我按名称尝试时,例如 i["start"],我收到一条错误消息,指出字符串索引必须是整数。我很困惑,而且我是 Python 新手,但我还没有找到任何关于此的内容。请帮忙!我只想访问用户名字段,这就是我尝试执行 for 循环的原因。提前致谢!

【问题讨论】:

标签: python json


【解决方案1】:

试试这个:

for i in readable["results"]:
    print i["username"]

【讨论】:

    【解决方案2】:

    加载你的 json 字符串:

    import json
    
    s = """
    {
      "start": 0,
      "terms": [
        "process_name:egagent.exe"
      ],
      "highlights": [],
      "total_results": 448,
      "filtered": {},
      "facets": {},
      "results": [
        {
          "username": "SYSTEM",
          "alert_type": "test"
        },
        {
          "username": "SYSTEM2",
          "alert_type": "test"
        }
       ]
    }
    """
    

    并为每个结果打印用户名:

    print [res['username'] for res in json.loads(s)['results']]
    

    输出:

    [u'SYSTEM', u'SYSTEM2']
    

    【讨论】:

      【解决方案3】:

      for i in readable 将通过readable 字典中的每个键迭代i。如果您随后打印i[0],您将打印每个键的第一个字符。

      假设您想要在与"results" 键关联的列表条目中与"username" 键关联的值,您可以这样获取它们:

      for result in readable["results"]:
           print (result["username"])
      

      【讨论】:

        【解决方案4】:

        如果 readable 是您的 JSON 对象 (dict),您可以像在每个地图中一样使用元素的键来访问元素。

        readable["results"][0]["username"]
        

        应该给你"SYSTEM"字符串作为结果。

        要打印每个用户名,请执行以下操作:

        for result in readable["results"]:
            print(result["username"])
        

        如果您的 JSON 是 str 对象,则必须为 deserialize it with json.loads(readable) first

        【讨论】:

        • 谢谢!我现在可以得到它,但它限制了我的数量。该输出中应该有 400 个左右,但我只看到 10 个。我应该如何调整 for 循环以解析每个结果中的每个用户名以获取每个用户名?我添加了一个迭代器,它被添加到每个循环中,但它只抓取 10 个左右。所以我有 for i in readable: print (readable["results"][count]["username"]) count +=1
        • 您必须向我们展示更多代码(当然不是整个 JSON,您可以用 ... 替换太多对象)。拥有多少results 并不重要。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多