[python] JSON 객체가 바이트를 받도록 허용하거나 urlopen 출력 문자열을 허용
Python 3에서는 URL에서 json 문서를 요청하고 있습니다.
response = urllib.request.urlopen(request)
response
객체와 파일 – 류의 객체입니다 read
및 readline
방법. 일반적으로 텍스트 모드에서 열린 파일로 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과 함께 작동합니다.
답변
나는 그 질문이 가장 좋은 답이라고 생각했다. 🙂
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로 설정된 경우 반환 값은 디코딩 된 유니 코드 문자열입니다.”