JSONDecodeError : 예상 값 : 1 행 1 열 (문자 0)


259

Expecting value: line 1 column 1 (char 0)JSON을 디코딩하려고 할 때 오류가 발생 합니다.

API 호출에 사용하는 URL은 브라우저에서 제대로 작동하지만 curl 요청을 통해 완료되면이 오류가 발생합니다. 다음은 curl 요청에 사용하는 코드입니다.

에 오류가 발생합니다 return simplejson.loads(response_json)

    response_json = self.web_fetch(url)
    response_json = response_json.decode('utf-8')
    return json.loads(response_json)


def web_fetch(self, url):
        buffer = StringIO()
        curl = pycurl.Curl()
        curl.setopt(curl.URL, url)
        curl.setopt(curl.TIMEOUT, self.timeout)
        curl.setopt(curl.WRITEFUNCTION, buffer.write)
        curl.perform()
        curl.close()
        response = buffer.getvalue().strip()
        return response

전체 역 추적 :

역 추적:

File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/Users/nab/Desktop/pricestore/pricemodels/views.py" in view_category
  620.     apicall=api.API().search_parts(category_id= str(categoryofpart.api_id), manufacturer = manufacturer, filter = filters, start=(catpage-1)*20, limit=20, sort_by='[["mpn","asc"]]')
File "/Users/nab/Desktop/pricestore/pricemodels/api.py" in search_parts
  176.         return simplejson.loads(response_json)
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/__init__.py" in loads
  455.         return _default_decoder.decode(s)
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/decoder.py" in decode
  374.         obj, end = self.raw_decode(s)
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/decoder.py" in raw_decode
  393.         return self.scan_once(s, idx=_w(s, idx).end())

Exception Type: JSONDecodeError at /pricemodels/2/dir/
Exception Value: Expecting value: line 1 column 1 (char 0)

2
마지막으로, 무엇을 print repr(response_json)전달하고 .loads()있습니까?
Martijn Pieters

4
하나 더 : 왜 simplejsonstdlib json( 와 같은 라이브러리simplejson )를 사용할 수 있습니까?
Martijn Pieters

3
빈 문자열입니다. 귀하의 web_fetch() 호출이 실패했습니다.
Martijn Pieters

1
예, 보다 사용 하기 쉬운 것이 좋습니다 pycurl. requests특히 진행 상황을 디버깅 할 때 훨씬 쉬운 API를 제공합니다. 특별히하지 않는 한 의 최신 버전 가지고 simplejson단지와 막대기, 도서관 json, 당신에게 관리 할 수있는 의존성을 절약 할 수 있습니다.
Martijn Pieters

1
이다 response_json의 반환 값 .json()? 그런 다음 이미 데이터를 디코딩 했으므로json.loads() 더 이상 사용할 필요가 없습니다. response당신을 위해 그것을 해독했다.
Martijn Pieters

답변:


124

주석의 대화를 요약하려면 다음을 수행하십시오.

  • simplejson라이브러리 를 사용할 필요가 없으며 json모듈 과 동일한 라이브러리가 Python에 포함되어 있습니다 .

  • UTF8에서 유니 코드로 응답을 디코딩 할 필요가 없으며, simplejson/ json .loads()메소드는 UTF8로 인코딩 된 데이터를 기본적으로 처리 할 수 ​​있습니다.

  • pycurl매우 오래된 API가 있습니다. 사용에 대한 특정 요구 사항이 없으면 더 나은 선택이 있습니다.

requestsJSON 지원을 포함하여 가장 친숙한 API를 제공합니다. 가능하면 통화를 다음으로 교체하십시오.

import requests

return requests.get(url).json()

93
requests!를 사용하여 동일한 오류가 발생합니다 ! 추적은 제안 할 것으로 보인다 requests사용 complexjson하는 용도, simplejson. 기묘한.
rayu

@Rayu : 가능한 경우 요청 이 사용simplejson 됩니다. 어떤 사람들은 Python stdlib에 번들로 제공된 것보다 최신 simplejson 릴리스를 사용하려고합니다.
Martijn Pieters

5
"simplejson 라이브러리를 사용할 필요가 없습니다. 동일한 라이브러리가 json 모듈과 동일한 라이브러리에 포함되어 있습니다."... 나는 동의하지 않습니다. simplejson내장 된 기능을 사용 json하지만보다 설명적인 오류가 발생합니다. 이 경우를 사용 json하면 generic을 제공합니다 ValueError: No JSON object could be decoded.
BoltzmannBrain

2
중단 또는 불완전한 json으로 인해 발생할 수 있습니까? 나는 이것을 무작위로 한 번에 얻었습니다.
Christophe Roussy

2
@ChristopheRoussy : 예, 그것은 문제의 요점입니다 (OP는 u'' 응답을 얻었습니다 ). 귀하는 JSONDecodeError이 오류로 실행하기 전에 많은 데이터가 성공적으로 구문 분석 말한다; 해당 시점에 잘못된 데이터가 있거나 (잘못된 JSON 문서가 손상되었거나) 데이터가 잘 렸기 때문일 수 있습니다.
Martijn Pieters

64

실제 데이터가 존재하고 데이터 덤프가 올바른 형식으로되어 있는지 응답 데이터 본문을 확인하십시오.

대부분의 경우 json.loads- JSONDecodeError: Expecting value: line 1 column 1 (char 0)오류는 다음으로 인해 발생합니다.

  • 비 JSON 준수 인용
  • XML / HTML 출력 (즉, <로 시작하는 문자열) 또는
  • 호환되지 않는 문자 인코딩

궁극적으로 오류는 첫 번째 위치에서 문자열이 이미 JSON을 준수하지 않는다는 것을 나타냅니다.

따라서 언뜻보기에 JSON처럼 보이는 데이터 본문이 있어도 구문 분석이 실패하면 데이터 본문 의 따옴표를 바꾸십시오.

import sys, json
struct = {}
try:
  try: #try parsing to dict
    dataform = str(response_json).strip("'<>() ").replace('\'', '\"')
    struct = json.loads(dataform)
  except:
    print repr(resonse_json)
    print sys.exc_info()

참고 : 데이터 내 따옴표는 올바르게 이스케이프되어야합니다


4
의견에서 OP는 빈 응답을 얻었습니다. requests.get(url).json()Just Works 이후 JSON도 변형되지 않았습니다.
Martijn Pieters

JSONDecodeError: Expecting value: line 1 column 1 (char 0)빈 문자열이 json 디코드로 전달 될 때 특히 발생
wesinat0r

JSONDecodeError: Expecting value: line 1 column 1 (char 0)json 응답의 첫 번째 라인이 유효하지 않은 경우에도 발생합니다. az cli명령 실행의 응답 예 는 ["WARNING: The default kind for created storage account will change to 'StorageV2' from 'Storage' in the future", '{',입니다. 이것은 나를 여기로 인도하는 오류를 주었다. 나머지 응답은 유효한 json 객체입니다. 첫 번째 줄만으로도 문제가 해결됩니다.
SeaDude

34

requestslib를 사용하면 JSONDecodeError404와 같은 http 오류 코드가 있고 응답을 JSON으로 구문 분석하려고 할 때 발생할 수 있습니다!

이 경우를 피하려면 먼저 200 (확인)을 확인하거나 오류 발생시이를 제기해야합니다. 덜 비밀스러운 오류 메시지로 실패하기를 바랍니다.

참고 : 주석 서버에 언급 된 Martijn Pieters 가 오류가 발생하면 JSON으로 응답 할 수 있으므로 (구현에 달려 있음) Content-Type헤더를 확인하는 것이 더 안정적입니다.


이전 의견에 대해 죄송하지만 예제에 연결할 수 있습니까? 기술을 "행동 수행"에서 "행동을 시도하고 응답을 반환하고 그에 따라 대응"하려고 노력하고 있습니다.
dcclassics

@dcclassics : 예 : 서버 측에서는 실패하고 서버는 JSON으로 응답하는 대신 오류 페이지 (HTML)를 표시하여 응답하므로 응답을 구문 분석하는 코드는 JSON을 읽으려고 시도하지만 HTML 태그에서는 실패합니다.
Christophe Roussy

1
서버는 오류 응답에 JSON 본문을 포함 할 수 있습니다. 200 건의 응답 만있는 것이 아닙니다. Content-Type 헤더를 확인하려고합니다.
Martijn Pieters

29

정신 검사가 실제로 호출하고 있는지 확인하는 것이 유용 할 수 있습니다 - 나는 그것의 가치는 당신이 JSON 파일 자체의 내용을 분석하고 경우에 언급 할 생각 json.loads()상의 내용 받는 사람이 아닌, 파일의 파일 경로 가 JSON의 :

json_file_path = "/path/to/example.json"

with open(json_file_path, 'r') as j:
     contents = json.loads(j.read())

나는 이것이 때때로 일어날 수 있음을 인정하는 것이 조금 당황 스럽다.

contents = json.loads(json_file_path)

글쎄요 .. 가끔 발생합니다. 고마워요.
Sachin Kumar

이 경우 json.load()대신 사용해야한다고 생각 합니다.
Coddy

13

파일의 인코딩 형식을 확인하고 파일을 읽는 동안 해당 인코딩 형식을 사용하십시오. 문제를 해결할 것입니다.

with open("AB.json", encoding='utf-8', errors='ignore') as json_data:
     data = json.load(json_data, strict=False)

3
이것은 작은 변경으로 나를 위해 encoding='utf-8'일했기 때문에 때로는 몇 가지를 시도해야한다고 생각합니다.
RobertMyles 2016 년

9

많은 경우, 구문 분석하려는 문자열이 비어 있기 때문입니다.

>>> import json
>>> x = json.loads("")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/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)

json_string미리 비어 있는지 확인하여 해결할 수 있습니다 .

import json

if json_string:
    x = json.loads(json_string)
else:
    // Your logic here
    x = {}

내 코드에서 추가로 디버깅하는 동안 호출 response.read()중이었고 다른 호출로 인해 결과가 나올 때 실망했습니다 Expecting value: line 1. 디버그 문을 제거하고 문제가 해결되었습니다.
Joe

디버깅하려면이 멋진 웹 사이트 jsonlint.com을
Roelant

4

decode ()를 호출 한 후에도 0이 포함될 수 있습니다. replace ()를 사용하십시오.

import json
struct = {}
try:
    response_json = response_json.decode('utf-8').replace('\0', '')
    struct = json.loads(response_json)
except:
    print('bad json: ', response_json)
return struct

2

요청을 사용하여 정확하게이 문제가 발생했습니다. 설명을 해준 Christophe Roussy에게 감사합니다.

디버깅하기 위해 다음을 사용했습니다.

response = requests.get(url)
logger.info(type(response))

API에서 404 응답을 받고있었습니다.


1
response.status_code또는 로 단순화 할 수 있습니다 print(response.status_code).
TitanFighter

1

요청 (파이썬 라이브러리)과 동일한 문제가있었습니다. 우연히 accept-encoding헤더.

다음과 같이 설정되었습니다. 'accept-encoding': 'gzip, deflate, br'

요청에서 간단히 제거하고 오류가 발생하지 않았습니다.


1

나에게는 요청에서 인증을 사용하지 않았습니다.


1

나에게 200 이외의 서버로 응답하고 응답이 json 형식이 아닙니다. json 파싱 전에이 작업을 마쳤습니다.

# this is the https request for data in json format
response_json = requests.get() 

# only proceed if I have a 200 response which is saved in status_code
if (response_json.status_code == 200):  
     response = response_json.json() #converting from json to dictionary using json library

이것은 나에게 문제였다. 상태 코드는 200 대신 500 (내부 서버 오류)이므로 json이 리턴되지 않으므로 json의 1 행 1 행에 아무것도 없습니다. 요청 상태 코드가 예상 한 것인지 항상 확인하십시오.
목숨

0

Windows 사용자 인 경우 Tweepy API는 데이터 오브젝트 사이에 빈 줄을 생성 할 수 있습니다. 이 상황으로 인해 "JSONDecodeError : 예상 값 : 1 행 1 열 (char 0)"오류가 발생할 수 있습니다. 이 오류를 피하기 위해 빈 줄을 삭제할 수 있습니다.

예를 들면 다음과 같습니다.

 def on_data(self, data):
        try:
            with open('sentiment.json', 'a', newline='\n') as f:
                f.write(data)
                return True
        except BaseException as e:
            print("Error on_data: %s" % str(e))
        return True

참조 : Twitter 스트림 API는 JSONDecodeError ( "Expecting value", s, err.value)를 None에서 제공합니다.


빈 줄이 문제라고 생각하지 않습니다. 오류가 1 행 1 열에 있음을 분명히 나타냅니다.이 해결 방법은 파일에서 BOM을 제거하기 때문에 효과가 있다고 생각합니다. 다음과 같이 빠르게 확인할 수 있습니다. 1. 원본 파일의 크기를 확인하고 (오른쪽 클릭> 속성) 134.859 바이트 일 수 있습니다. 2. 메모장에서 원본 파일을여십시오 ++ 3. 인코딩을 "UTF-8-BOM"에서 "UTF-8-BOM"으로 변경하십시오. UTF-8 ". 저장 4. 크기를 다시 확인하십시오. 약 134.856 (3 바이트 미만)
Alex 75

0

요청에 상태 코드 200이 있는지 확인하십시오. 예를 들면 다음과 같습니다.

if status != 200:
    print("An error has occured. [Status code", status, "]")
else:
    data = response.json() #Only convert to Json when status is OK.
    if not data["elements"]:
        print("Empty JSON")
    else:
        "You can extract data here"

0

파이썬 기반 웹 API의 응답에서 이러한 오류가 발생 .text했지만 여기로 연결되어 비슷한 문제가있는 다른 사람들에게 도움이 될 수 있습니다 ( requests.

사용 json.dumps()상의 요청 data 게시 나를 위해 문제를 해결하기 전에 JSON의 올바르게 이스케이프 문자열을 만들 인수

requests.post(url, data=json.dumps(data))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.