JSONDecodeError: ค่าที่ต้องการ: บรรทัด 1 คอลัมน์ 1 (ถ่าน 0)


259

ฉันได้รับข้อผิดพลาดExpecting value: line 1 column 1 (char 0)เมื่อพยายามถอดรหัส JSON

URL ที่ฉันใช้สำหรับการเรียก API นั้นทำงานได้ดีในเบราว์เซอร์ แต่ให้ข้อผิดพลาดนี้เมื่อดำเนินการผ่านคำขอ 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
อีกอย่างหนึ่ง: ทำไมต้องใช้simplejsonเมื่อคุณสามารถใช้ stdlib 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ไลบรารีเดียวกันนี้รวมอยู่ใน Python เป็นjsonโมดูล

  • ไม่จำเป็นต้องถอดรหัสการตอบสนองจาก UTF8 เป็น Unicode วิธีsimplejson/ json .loads()สามารถจัดการข้อมูลที่เข้ารหัส UTF8 ได้

  • pycurlมี API ที่เก่าแก่มาก หากคุณไม่มีข้อกำหนดเฉพาะสำหรับการใช้งาน

requestsเสนอ API ที่เป็นมิตรที่สุดรวมถึงการสนับสนุน JSON หากสามารถทำได้ให้แทนที่การโทรด้วย:

import requests

return requests.get(url).json()

93
ฉันได้รับข้อผิดพลาดเดียวกันนี้โดยใช้requests! ร่องรอยดูเหมือนจะชี้ให้เห็นว่าrequestsการใช้งานที่ใช้complexjson simplejsonแปลก.
rayu

@Rayu: คำขอจะใช้simplejsonถ้ามี บางคนต้องการใช้รุ่น Simplejson ล่าสุดแทนที่จะเป็นรุ่นที่มาพร้อมกับ Python stdlib
Martijn Pieters

5
"ไม่จำเป็นต้องใช้ไลบรารี Simplejson ไลบรารีเดียวกันนี้รวมอยู่ใน Python เหมือนกับโมดูล json" ... ฉันไม่เห็นด้วยอย่างเคารพ simplejsonใช้ built-in jsonภายใต้ประทุน แต่ให้ข้อผิดพลาดที่อธิบายเพิ่มเติม ในกรณีนี้การใช้jsonจะให้สามัญ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

ดังนั้นหากการแยกวิเคราะห์ล้มเหลวแม้จะมี data-body ที่ดูเหมือนJSONในครั้งแรกลองเปลี่ยนคำพูดของ data-body:

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 JSONDecodeErrorสามารถเกิดขึ้นได้เมื่อคุณมีรหัสข้อผิดพลาด http เช่น 404 และพยายามแยกการตอบสนองเป็น JSON!

คุณต้องตรวจสอบ 200 (OK) ก่อนหรือปล่อยให้เกิดข้อผิดพลาดเพื่อหลีกเลี่ยงกรณีนี้ ฉันหวังว่ามันจะล้มเหลวด้วยข้อความผิดพลาดที่เป็นความลับน้อยลง

หมายเหตุ : ตามที่ Martijn Pieters ระบุไว้ในเซิร์ฟเวอร์ความคิดเห็นสามารถตอบสนองกับ JSON ในกรณีที่เกิดข้อผิดพลาด (ขึ้นอยู่กับการใช้งาน) ดังนั้นการตรวจสอบContent-Typeส่วนหัวนั้นน่าเชื่อถือมากขึ้น


ขออภัยสำหรับความคิดเห็นเก่า แต่คุณสามารถลิงก์ไปยังตัวอย่างได้หรือไม่ ฉันพยายามใช้ทักษะของฉันจาก "ดำเนินการ" เพื่อ "พยายามดำเนินการตอบกลับตอบสนอง"
dcclassics

@dcclassics: ตัวอย่าง: ล้มเหลวบนฝั่งเซิร์ฟเวอร์และเซิร์ฟเวอร์ตอบกลับโดยแสดงหน้าข้อผิดพลาด (HTML) แทนการตอบด้วย JSON ดังนั้นรหัสการแยกวิเคราะห์คำตอบจะพยายามอ่าน JSON แต่จะล้มเหลวบนแท็ก HTML
Christophe Roussy

1
เซิร์ฟเวอร์สามารถและรวมเนื้อความ JSON ไว้ในการตอบสนองข้อผิดพลาด มันไม่ใช่แค่ 200 คำตอบตกลง คุณต้องการตรวจสอบส่วนหัวของประเภทเนื้อหา
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)

.. บางครั้งมันก็เกิดขึ้น ขอบคุณมันทำงานได้ btw
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

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ฯลฯ ลบคำสั่งแก้ปัญหาและแก้ไขปัญหา
โจ

ในการแก้ปัญหาคุณสามารถใช้เว็บไซต์ที่ดีนี้jsonlint.com
Roelant

4

อาจมีการฝัง 0 ของแม้หลังจากโทรถอดรหัส () ใช้แทนที่ ():

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))

ฉันได้รับการตอบกลับ 404 จาก API


1
มันสามารถจะง่ายไปหรือresponse.status_code print(response.status_code)
TitanFighter

1

ฉันมีปัญหาเดียวกันกับคำขอ (ห้องสมุดหลาม) มันเป็นaccept-encodingส่วนหัว

มันถูกตั้งค่าด้วยวิธีนี้: 'accept-encoding': 'gzip, deflate, br'

ฉันเพียงแค่ลบออกจากคำขอและหยุดรับข้อผิดพลาด



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

นี่เป็นปัญหาสำหรับฉัน รหัสสถานะคือ 500 (ข้อผิดพลาดเซิร์ฟเวอร์ภายใน) แทนที่จะเป็น 200 ดังนั้นจึงไม่ส่งคืน json ดังนั้นจึงไม่มีสิ่งใดในบรรทัด 1 col 1 ของ json ดีเสมอที่จะตรวจสอบว่ารหัสสถานะคำขอเป็นสิ่งที่คุณคาดหวังว่าจะเป็น
thposs

0

หากคุณเป็นผู้ใช้ Windows Tweepy API สามารถสร้างบรรทัดว่างระหว่างวัตถุข้อมูล เนื่องจากสถานการณ์นี้คุณสามารถรับ "JSONDecodeError: ต้องการค่า: บรรทัด 1 คอลัมน์ 1 (ถ่าน 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 stream API ให้ JSONDecodeError ("ค่าที่คาดหวัง", s, err.value) จากไม่มี


ฉันไม่คิดว่าบรรทัดว่างเปล่าเป็นปัญหา มันระบุอย่างชัดเจนว่าข้อผิดพลาดอยู่ในบรรทัดที่ 1 คอลัมน์ 1 ฉันคิดว่าวิธีแก้ปัญหานี้ใช้งานได้เนื่องจากกำลังลบ BOM ออกจากไฟล์ คุณสามารถตรวจสอบได้อย่างรวดเร็ว: 1. ตรวจสอบขนาดของไฟล์ต้นฉบับของคุณ (คลิกขวา> คุณสมบัติ), สามารถเป็น 134.859 ไบต์ 2. เปิดไฟล์ต้นฉบับด้วย Notepad ++ 3. เปลี่ยนการเข้ารหัสจาก "UTF-8-BOM" เป็น " UTF-8" บันทึก 4. ตรวจสอบขนาดอีกครั้ง มันสามารถอยู่ที่ 134.856 (น้อยกว่า 3 ไบต์)
อเล็กซ์ 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 หลาม-based ของ.textแต่มันทำให้ฉันที่นี่ดังนั้นนี้อาจช่วยให้คนอื่น ๆ ที่มีปัญหาที่คล้ายกัน (มันยากมากที่จะกรองการตอบสนองและขอปัญหาในการค้นหาเมื่อใช้requests.. )

ใช้json.dumps()ในการร้องขอ dataหาเรื่องเพื่อสร้างสตริงอย่างถูกต้องหนีของ JSON ก่อนโพสต์แก้ไขปัญหาสำหรับผม

requests.post(url, data=json.dumps(data))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.