如何从嵌套的 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)
会将<Response 200>
转换为'<Response 200>'
。
【参考方案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
您改为将其提供给 <Response [200]>
>>> r = requests.get('http://www.google.com')
>>> r
<Response [200]>
>>> type(r)
<class 'requests.models.Response'>
(仔细查看错误消息。Expected string or buffer
这意味着您提供的内容是 NOT 字符串或缓冲区(在这种情况下是一个对象))
这就是str(r)
不起作用的原因。因为它只是将<Response 200>
转换为'<Response 200>'
这显然不是json。
将此行更改为parsed = json.loads(r.text)
。
>>> type(r.text)
<type 'unicode'>
然后parsed['objects'][0]['ip']
应该给你IP地址:)
你可以找到更多关于请求模块here
【讨论】:
以上是关于如何从嵌套的 json 值中提取特定值。?的主要内容,如果未能解决你的问题,请参考以下文章