Python에서 없음에서 JSONDecodeError(예상 값, S, err.value) 발생 해결
Python에서 URL 및 API로 작업할 때 종종 urllib
및 json
라이브러리를 사용해야 합니다. 더 중요한 것은 json
라이브러리가 특히 API를 사용하여 데이터를 전송하는 기본 방법인 JSON 데이터를 처리하는 데 도움이 된다는 것입니다.
json
라이브러리에는 JSONDecodeError
오류를 반환하는 loads()
메서드가 있습니다. 이 기사에서는 이러한 오류를 해결하고 적절하게 처리하는 방법에 대해 설명합니다.
try
를 사용하여 Python에서 raise JSONDecodeError("Expecting value", s, err.value) from None
해결
JSON을 다루기 전에는 종종 urllib
패키지를 통해 데이터를 받아야 했습니다. 그러나 urllib 패키지로 작업할 때 오류가 발생할 수 있으므로 이러한 패키지를 코드로 가져오는 방법을 이해하는 것이 중요합니다.
urllib
패키지를 사용하려면 패키지를 가져와야 합니다. 종종 사람들은 아래와 같이 가져올 수 있습니다.
import urllib
queryString = {"name": "Jhon", "age": "18"}
urllib.parse.urlencode(queryString)
위 코드의 출력은 AttributeError
를 제공합니다.
Traceback (most recent call last):
File "c:\Users\akinl\Documents\HTML\python\test.py", line 3, in <module>
urllib.parse.urlencode(queryString)
AttributeError: module 'urllib' has no attribute 'parse'
urllib
를 가져오는 올바른 방법은 아래에서 볼 수 있습니다.
import urllib.parse
queryString = {"name": "Jhon", "age": "18"}
urllib.parse.urlencode(queryString)
또는 as
키워드와 별칭(종종 더 짧음)을 사용하여 Python 코드를 더 쉽게 작성할 수 있습니다.
import urllib.parse as urlp
queryString = {"name": "Jhon", "age": "18"}
urlp.urlencode(queryString)
위의 모든 작업은 request
, error
및 robotparser
에 대해 작동합니다.
import urllib.request
import urllib.error
import urllib.robotparser
이러한 일반적인 오류를 제거하면 이전에 본 것처럼 json.load()
기능.
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
load()
메서드는 인수로 받은 유효한 JSON 문자열을 구문 분석하고 조작을 위해 Python 사전으로 변환합니다. 오류 메시지는 JSON 값을 예상했지만 받지 못했다는 것을 보여줍니다.
즉, 코드가 JSON 문자열을 구문 분석하지 않았거나 빈 문자열을 load()
메소드로 구문 분석하지 않았음을 의미합니다. 빠른 코드 조각으로 이를 쉽게 확인할 수 있습니다.
import json
data = ""
js = json.loads(data)
코드 출력:
Traceback (most recent call last):
File "c:\Users\akinl\Documents\python\texts.py", line 4, in <module>
js = json.loads(data)
File "C:\Python310\lib\json\__init__.py", line 346, in loads
return _default_decoder.decode(s)
File "C:\Python310\lib\json\decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Python310\lib\json\decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
동일한 오류 메시지가 표시되며 빈 문자열 인수에서 오류가 발생했음을 확인할 수 있습니다.
더 자세한 예를 들어 Google Map API에 액세스하여 사용자 위치(예: US 또는 NG)를 수집하려고 시도하지만 값을 반환하지 않습니다.
import urllib.parse
import urllib.request
import json
googleURL = "http://maps.googleapis.com/maps/api/geocode/json?"
while True:
address = input("Enter location: ")
if address == "exit":
break
if len(address) < 1:
break
url = googleURL + urllib.parse.urlencode({"sensor": "false", "address": address})
print("Retrieving", url)
uReq = urllib.request.urlopen(url)
data = uReq.read()
print("Returned", len(data), "characters")
js = json.loads(data)
print(js)
코드 출력:
Traceback (most recent call last):
File "C:\Users\akinl\Documents\html\python\jsonArt.py", line 18, in <module>
js = json.loads(str(data))
File "C:\Python310\lib\json\__init__.py", line 346, in loads
return _default_decoder.decode(s)
File "C:\Python310\lib\json\decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Python310\lib\json\decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
동일한 오류가 발생했습니다. 그러나 이러한 오류를 포착하고 고장을 방지하기 위해 try/except
논리를 사용하여 코드를 보호할 수 있습니다.
따라서 요청 시점에 API가 JSON 값을 반환하지 않으면 오류가 아닌 다른 표현식을 반환할 수 있습니다.
위의 코드는 다음과 같습니다.
import urllib.parse
import urllib.request
import json
googleURL = "http://maps.googleapis.com/maps/api/geocode/json?"
while True:
address = input("Enter location: ")
if address == "exit":
break
if len(address) < 1:
break
url = googleURL + urllib.parse.urlencode({"sensor": "false", "address": address})
print("Retrieving", url)
uReq = urllib.request.urlopen(url)
data = uReq.read()
print("Returned", len(data), "characters")
try:
js = json.loads(str(data))
except:
print("no json returned")
위치를 US
로 입력할 때의 코드 출력:
Enter location: US
Retrieving http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=US
Returned 237 characters
no json returned
반환된 JSON 값이 없기 때문에 코드는 no json 반환됨
을 인쇄합니다. 오류는 제어할 수 없는 인수가 없는 경우에 더 가깝기 때문에 try/except
의 사용이 중요합니다.
Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.
LinkedIn관련 문장 - Python Error
- AttributeError 수정: Python에서 'generator' 객체에 'next' 속성이 없습니다.
- AttributeError 해결: 'list' 객체 속성 'append'는 읽기 전용입니다.
- AttributeError 해결: Python에서 'Nonetype' 객체에 'Group' 속성이 없습니다.
- AttributeError: 'Dict' 객체에 Python의 'Append' 속성이 없습니다.
- AttributeError: 'NoneType' 객체에 Python의 'Text' 속성이 없습니다.
- AttributeError: Int 객체에 속성이 없습니다.