[python] JSON 객체가 바이트를 받도록 허용하거나 urlopen 출력 문자열을 허용

Python 3에서는 URL에서 json 문서를 요청하고 있습니다.

response = urllib.request.urlopen(request)

response객체와 파일 – 류의 객체입니다 readreadline방법. 일반적으로 텍스트 모드에서 열린 파일로 JSON 객체를 만들 수 있습니다.

obj = json.load(fp)

내가하고 싶은 것은 :

obj = json.load(response)

그러나 urlopen은 파일 객체를 이진 모드로 반환하므로 작동하지 않습니다.

해결 방법은 물론 :

str_response = response.read().decode('utf-8')
obj = json.loads(str_response)

그러나 이것은 기분이 좋지 않습니다 …

바이트 파일 객체를 문자열 파일 객체로 변환하는 더 좋은 방법이 있습니까? 또는 인코딩 urlopen또는 매개 변수가 누락 json.load되었습니까?



답변

HTTP는 바이트를 보냅니다. 해당 리소스가 텍스트 인 경우 일반적으로 Content-Type HTTP 헤더 또는 다른 메커니즘 (RFC, HTML meta http-equiv, …) 으로 문자 인코딩이 지정됩니다 .

urllib 해야 문자열로 바이트를 인코딩하는 방법을 알고,하지만 너무 순진 – 그건 무섭게 파워 부족 및 취소 파이썬 라이브러리입니다.

Python 3으로 다이빙 은 상황에 대한 개요를 제공합니다.

“해결 방법”은 문제가 없지만 올바른 방법입니다.


답변

구조에 대한 파이썬의 훌륭한 표준 라이브러리…

import codecs

reader = codecs.getreader("utf-8")
obj = json.load(reader(response))

py2 및 py3과 함께 작동합니다.

문서 : Python 2 , Python3


답변

나는 그 질문이 가장 좋은 답이라고 생각했다. 🙂

import json
from urllib.request import urlopen

response = urlopen("site.com/api/foo/bar").read().decode('utf8')
obj = json.loads(response)


답변

requests라이브러리를 사용 하여이 문제를 해결하려는 다른 사람은 다음을 수행하십시오 .

import json
import requests

r = requests.get('http://localhost/index.json')
r.raise_for_status()
# works for Python2 and Python3
json.loads(r.content.decode('utf-8'))


답변

이것은 나를 위해 작동합니다. 나는 ‘요청’라이브러리를 사용 하여 인간 요청json() 의 문서 를 확인했습니다.

import requests

url = 'here goes your url'

obj = requests.get(url).json() 


답변

Python 3.4.3 & 3.5.2와 Django 1.11.3을 사용하여 비슷한 문제가 발생했습니다. 그러나 Python 3.6.1로 업그레이드하면 문제가 해결되었습니다.

https://docs.python.org/3/whatsnew/3.6.html#json 에서 자세한 내용을 확인할 수 있습니다.

특정 버전의 Python에 묶이지 않으면 3.6 이상으로 업그레이드하십시오.


답변

플라스크 마이크로 프레임 워크를 사용하는 동안이 문제가 발생하면 다음을 수행하면됩니다.

data = json.loads(response.get_data(as_text=True))

문서에서 : “as_text가 True로 설정된 경우 반환 값은 디코딩 된 유니 코드 문자열입니다.”