如何从嵌套的 json 值中提取特定值。?

Posted

技术标签:

【中文标题】如何从嵌套的 json 值中提取特定值。?【英文标题】:How to extract parrticular value from nested json values.? 【发布时间】:2016-03-12 20:52:19 【问题描述】:

我是 python 新手。

我有一个小要求(即)只想从 JSON 格式中提取一个值。

如果我错了,请纠正我。

JSON 输入是:


  "meta": 
    "limit": 1,
    "next": "/api/v1/ips/?username=sic1&api_key=689db0740ed73c2bf6402a7de0fcf2d7b57111ca&limit=1&objects=&offset=1",
    "offset": 0,
    "previous": null,
    "total_count": 56714
  ,
  "objects": [
    
      "_id": "556f4c81dcddec0c41463529",
      "bucket_list": [],
      "campaign": [
        
          "analyst": "prabhu",
          "confidence": "medium",
          "date": "2015-06-03 14:50:41.440000",
          "name": "Combine"
        
      ],
      "created": "2015-06-03 14:50:41.436000",
      "ip": "85.26.162.70",
      "locations": [],
      "modified": "2015-06-18 09:50:51.612000",
      "objects": [],
      "relationships": [
        
          "analyst": "prabhu",
          "date": "2015-06-18 09:50:51.369000",
          "rel_confidence": "unknown",
          "rel_reason": "N/A",
          "relationship": "Related_To",
          "relationship_date": "2015-06-18 09:50:51.369000",
          "type": "Indicator",
          "value": "556f4c81dcddec0c4146353a"
        
      ],
      "releasability": [],
      "schema_version": 3,
      "screenshots": [],
      "sectors": [],
      "source": [
        
          "instances": [
            
              "analyst": "prabhu",
              "date": "2015-06-03 14:50:41.438000",
              "method": "trawl",
              "reference": "http://www.openbl.org/lists/base_30days.txt"
            
          ],
          "name": "www.openbl.org"
        
      ],
      "status": "New",
      "tickets": [],
      "type": "Address - ipv4-addr"
    
  ]

我用于从对象中获取仅 IP 值的代码

import requests
from pprint import pprint
import json
url = 'http://127.0.0.1:8080/api/v1/ips/'
params = 'api_key':'xxxxxx','username': 'abcd'
r = requests.get(url, params=params, verify=False)
parsed = json.loads(r)
print (parsed['objects']['ip'])

我收到的错误是:

Traceback (most recent call last):
  File "testapi.py", line 9, in <module>
    parsed = json.loads(r)
  File "/usr/lib/python2.7/json/__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
TypeError: expected string or buffer

我只想从那个 JSON 输入中获取 IP。

谢谢。

【问题讨论】:

您可以通过 parsed = json.loads(str(r))r 的值转换为字符串 @TonyRoczz str(r) 会将&lt;Response 200&gt; 转换为'&lt;Response 200&gt;' 【参考方案1】:

您将请求对象而不是str 对象传递给json.loads()。你需要改变

parsed = json.loads(r)

parsed = json.loads(r.text)

另外,parsed['objects'] 是一个列表,您需要访问它的第一个元素然后获取密钥ip

>>> print(parsed['objects'][0]['ip'])

【讨论】:

非常感谢,现在可以使用了。一个小疑问为什么我们使用print(parsed['objects'][0]['ip']) 而不是像这样使用print(parsed['objects']['ip']) @TejaR parsed['objects'] 是一个列表,你需要使用[0]访问它的第一个元素【参考方案2】:

问题出在这一行:parsed = json.loads(r)

您正在接收 json 响应,但将 json 元素提供给 json.loads 您改为将其提供给 &lt;Response [200]&gt;

    >>> r = requests.get('http://www.google.com')
    >>> r
    <Response [200]>
    >>> type(r)
    <class 'requests.models.Response'>

(仔细查看错误消息。Expected string or buffer 这意味着您提供的内容是 NOT 字符串或缓冲区(在这种情况下是一个对象)) 这就是str(r) 不起作用的原因。因为它只是将&lt;Response 200&gt; 转换为'&lt;Response 200&gt;' 这显然不是json。

将此行更改为parsed = json.loads(r.text)

   >>> type(r.text)
   <type 'unicode'>

然后parsed['objects'][0]['ip']应该给你IP地址:) 你可以找到更多关于请求模块here

【讨论】:

以上是关于如何从嵌套的 json 值中提取特定值。?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 MySQL 中的数字键嵌套 JSON 字段中提取值

如何从 SQL 中的列值中提取特定部分(Redshift 平台)

如何从SQL中的列值中提取特定部分(Redshift平台)

C# 如何直接从 JSON String 中提取特定值 ?

如何在 Python 的列表值中添加特定字符?

如何从 JMeter 的 json 响应中的长 html 内容中提取特定的 *token* 值