Python에서 없음에서 JSONDecodeError(예상 값, S, err.value) 발생 해결

Olorunfemi Akinlua 2023년10월10일
Python에서 없음에서 JSONDecodeError(예상 값, S, err.value) 발생 해결

Python에서 URL 및 API로 작업할 때 종종 urllibjson 라이브러리를 사용해야 합니다. 더 중요한 것은 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, errorrobotparser에 대해 작동합니다.

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 Akinlua avatar Olorunfemi Akinlua avatar

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