Python 3 获取和解析 JSON API

Posted

技术标签:

【中文标题】Python 3 获取和解析 JSON API【英文标题】:Python 3 Get and parse JSON API 【发布时间】:2016-05-09 07:08:03 【问题描述】:

如何使用 python 解析 json api 响应? 我目前有这个:

import urllib.request
import json

url = 'https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty'

def response(url):
    with urllib.request.urlopen(url) as response:
        return response.read()

res = response(url)
print(json.loads(res))

我收到此错误: TypeError: JSON 对象必须是 str,而不是 'bytes'

pythonic 处理 json api 的方式是什么?

【问题讨论】:

【参考方案1】:

版本 1:(在运行脚本之前执行 pip install requests

import requests
r = requests.get(url='https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty')
print(r.json())

版本 2:(在运行脚本之前执行 pip install wget

import wget

fs = wget.download(url='https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty')
with open(fs, 'r') as f:
    content = f.read()
print(content)

【讨论】:

【参考方案2】:

你可以使用标准库python3:

import urllib.request
import json
url = 'http://www.reddit.com/r/all/top/.json'
req = urllib.request.Request(url)

##parsing response
r = urllib.request.urlopen(req).read()
cont = json.loads(r.decode('utf-8'))
counter = 0

##parcing json
for item in cont['data']['children']:
    counter += 1
    print("Title:", item['data']['title'], "\nComments:", item['data']['num_comments'])
    print("----")

##print formated
#print (json.dumps(cont, indent=4, sort_keys=True))
print("Number of titles: ", counter)

输出将是这样的:

...
Title: Maybe we shouldn't let grandma decide things anymore.  
Comments: 2018
---- 
Title: Carrie Fisher and Her Stunt Double Sunbathing on the Set of Return of The Jedi, 1982  
Comments: 880
---- 
Title: fidget spinner  
Comments: 1537
---- 
Number of titles:  25

【讨论】:

【参考方案3】:

我通常会使用requests 包和json 包。以下代码应该适合您的需求:

import requests
import json

url = 'https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty'
r = requests.get(url)
print(json.loads(r.content))

输出

[11008076, 
 11006915, 
 11008202,
 ...., 
 10997668,
 10999859,
 11001695]

【讨论】:

使用 requests 确实是最容易使用的解决方案。 我正在使用 Python 3.5,但出现错误:AttributeError: module 'requests' has no attribute 'get' 关于如何解决此问题的任何想法? 您可能没有安装它 - 尝试从命令行运行 pip install requests 我试过这个,但我得到了错误:the JSON object must be str, not 'bytes'...知道为什么吗? @pookie 尝试使用:print(json.loads(r.text)),您可以查看差异,只需使用:type(r.text) type(r.content)【参考方案4】:

原始问题中唯一缺少的是对响应对象上的decode 方法的调用(即使这样,也不是针对每个python3 版本)。很遗憾没有人指出这一点,每个人都跳入了第三方库。

仅使用标准库,用于最简单的用例:

import json
from urllib.request import urlopen


def get(url, object_hook=None):
    with urlopen(url) as resource:  # 'with' is important to close the resource after use
        return json.load(resource, object_hook=object_hook)

简单用例:

data = get('http://url') # ' "id": 1, "$key": 13213654 '
print(data['id']) # 1
print(data['$key']) # 13213654

或者,如果您愿意,但风险更大:

from types import SimpleNamespace

data = get('http://url', lambda o: SimpleNamespace(**o)) # ' "id": 1, "$key": 13213654 '
print(data.id) # 1
print(data.$key) # invalid syntax
# though you can still do
print(data.__dict__['$key'])

【讨论】:

【参考方案5】:

使用 Python 3

import requests
import json

url = 'http://IP-Address:8088/ws/v1/cluster/scheduler'
r = requests.get(url)
data = json.loads(r.content.decode())

【讨论】:

import requests import json sn-p 应该作为复制和粘贴。否则很好简洁的答案

以上是关于Python 3 获取和解析 JSON API的主要内容,如果未能解决你的问题,请参考以下文章

在 Actionscript 中获取和解析 JSON

解析 json 文件以获取要插入 bigquery 的正确列

使用 Python 解析 JSON?

text 使用AsyncTask和okHttp&JSON解析获取API数据

python解析json数据

Python 请求 - 快速知道响应是不是是 json 可解析的