JSONDecodeError: अपेक्षित मूल्य: पंक्ति 1 कॉलम 1 (char 0)


258

Expecting value: line 1 column 1 (char 0)JSON को डिकोड करने की कोशिश करते समय मुझे त्रुटि हो रही है ।

एपीआई कॉल के लिए मैं जिस URL का उपयोग करता हूं वह ब्राउज़र में ठीक काम करता है, लेकिन कर्ल अनुरोध के माध्यम से यह त्रुटि देता है। निम्नलिखित कोड मैं कर्ल अनुरोध के लिए उपयोग करता हूं।

पर त्रुटि होती है 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()?
मार्टिन पीटर्स

4
एक और: simplejsonजब आप सिर्फ stdlib का उपयोग कर सकते हैं json(जो कि उसी पुस्तकालय के रूप में हैsimplejson ) का उपयोग क्यों करें ?
मार्टिन पीटर्स

3
वह एक खाली तार है। आपकी web_fetch() कॉल विफल रही।
मार्टिन पीटर्स

1
हां, मैं आपको सलाह देता हूं कि आप उपयोग करने में कुछ आसान का उपयोग करें pycurlrequestsएक आसान एपीआई प्रदान करता है, खासकर जब यह डीबग करने की बात आती है कि क्या चल रहा है। जब तक आपके पास विशेष रूप से simplejsonपुस्तकालय का एक नया संस्करण होना चाहिए , बस के साथ रहना json, आपको प्रबंधन करने के लिए एक निर्भरता बचाता है।
मार्टिन पीटर्स

1
का response_jsonवापसी मूल्य क्या है .json()? तब आपके पास पहले से डेटा डिकोड हो चुका है और json.loads()अब और उपयोग करने की आवश्यकता नहीं है। responseइसे आपके लिए डिकोड किया गया।
मार्टिन पीटर्स

जवाबों:


123

टिप्पणियों में वार्तालाप को संक्षेप में प्रस्तुत करने के लिए:

  • simplejsonपुस्तकालय का उपयोग करने की कोई आवश्यकता नहीं है , वही पुस्तकालय jsonमॉड्यूल के रूप में पायथन के साथ शामिल है ।

  • UTF8 से यूनिकोड तक प्रतिक्रिया को डिकोड करने की आवश्यकता नहीं है, simplejson/ json .loads()पद्धति UTF8 एन्कोडेड डेटा को मूल रूप से संभाल सकती है।

  • pycurlबहुत पुरातन एपीआई है। जब तक आपको इसका उपयोग करने के लिए एक विशिष्ट आवश्यकता नहीं होती है, तब तक बेहतर विकल्प होते हैं।

requestsJSON समर्थन सहित सबसे अनुकूल एपीआई प्रदान करता है। यदि आप कर सकते हैं, तो अपने कॉल को इसके साथ बदलें:

import requests

return requests.get(url).json()

93
मैं इसी त्रुटि का उपयोग कर रहा हूँ requests! ट्रेस यह सुझाव देता है कि requestsउपयोग करता है complexjson, जो उपयोग करता है simplejson। अजीब।
रेयू

@Rayu: अनुरोध उपलब्ध होने पर उपयोग करेगाsimplejson ; कुछ लोग पायथन stdlib के साथ बंडल किए जाने के बजाय नवीनतम सिम्पसन रिलीज का उपयोग करना चाहते हैं।
मार्टिन पीटर्स

5
"सिंपलसन लाइब्रेरी का उपयोग करने की कोई आवश्यकता नहीं है, वही लाइब्रेरी पायसन के साथ जस मॉड्यूल के रूप में शामिल है।" ... मैं सम्मानपूर्वक असहमत हूं। simplejsonअंतर्निहित jsonहुड का उपयोग करता है , लेकिन अधिक वर्णनात्मक त्रुटियां देता है। इस मामले में उपयोग jsonकरना आपको एक सामान्य जानकारी देगा ValueError: No JSON object could be decoded
बोल्ट्जमनब्रेन

2
क्या यह एक गर्भपात या अपूर्ण जोंस के कारण हो सकता है? मुझे यह अनियमित रूप से एक बार मिलता है, यह सुनिश्चित नहीं है कि इसे कैसे पुन: पेश किया जाए।
क्रिस्टोफ़ रूसो

2
@ChristopheRoussy: हाँ, यह सवाल का बिंदु है (ओपी को एक खाली u'' प्रतिक्रिया मिली)। आपका यह JSONDecodeErrorबताता है कि त्रुटि होने से पहले डेटा को सफलतापूर्वक पार्स कर दिया गया था; ऐसा इसलिए हो सकता है क्योंकि उस बिंदु पर अमान्य डेटा है (विकृत या दूषित JSON दस्तावेज़) या क्योंकि डेटा छोटा था।
मार्टिन पीटर्स

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
टिप्पणियों में यह स्पष्ट था कि ओपी को एक खाली प्रतिक्रिया मिली। requests.get(url).json()जस्ट वर्क्स के बाद से , JSON या तो विकृत नहीं है।
मार्टिन पीटर्स

JSONDecodeError: Expecting value: line 1 column 1 (char 0) विशेष रूप से तब होता है जब एक खाली स्ट्रिंग को json डीकोड करने के लिए पारित किया जाता है
डेकोड

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", '{',। इससे मुझे वह त्रुटि मिली जो मुझे यहां तक ​​ले जाती है। बाकी प्रतिक्रिया एक वैध जोंस वस्तु है। बस पहली पंक्ति चीजों को तोड़ती है।
सीडूड

34

साथ requestslib JSONDecodeErrorजब आप 404 की तरह एक http त्रुटि कोड है और JSON के रूप में प्रतिसाद पार्स करने की कोशिश भी हो सकता है!

आपको पहले 200 (ओके) के लिए जांच करनी चाहिए या इस मामले से बचने के लिए त्रुटि को बढ़ाने देना चाहिए। मैं चाहता हूं कि यह एक कम गूढ़ त्रुटि संदेश के साथ विफल रहा।

ध्यान दें : जैसा कि मार्टिज़न पीटरर्स ने कहा था कि सर्वर त्रुटियों के मामले में JSON के साथ प्रतिक्रिया कर सकते हैं (यह कार्यान्वयन पर निर्भर करता है), इसलिए Content-Typeहेडर की जांच करना अधिक विश्वसनीय है।


पुरानी टिप्पणी के लिए क्षमा करें, लेकिन क्या आप एक उदाहरण से लिंक कर सकते हैं? मैं अपने कौशल को "प्रदर्शन करने की क्रिया", "क्रिया करने का प्रयास, प्रतिक्रिया वापस करने, तदनुसार प्रतिक्रिया करने" का प्रयास कर रहा हूं।
22

@dcclassics: उदाहरण: यह सर्वर-साइड पर विफल रहता है और सर्वर JSON के साथ उत्तर देने के बजाय एक त्रुटि पृष्ठ (HTML) दिखा कर जवाब देता है, इसलिए उत्तर को पार्स करने वाला कोड JSON पढ़ने का प्रयास करेगा लेकिन HTML टैग पर विफल हो जाएगा।
क्रिस्टोफ रूसो

1
सर्वर त्रुटि प्रतिक्रियाओं में JSON निकायों को शामिल और कर सकते हैं। यह सिर्फ 200 ठीक प्रतिक्रियाएं नहीं है। आप सामग्री-प्रकार हेडर की जांच करना चाहते हैं।
मार्टिन पीटर्स

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 काम किया।
सचिन कुमार

मुझे लगता है कि उस मामले में एक के json.load()बजाय उपयोग करना चाहिए ।
कोडी

13

अपनी फ़ाइल के एन्कोडिंग प्रारूप की जाँच करें और फ़ाइल को पढ़ते समय संबंधित एन्कोडिंग प्रारूप का उपयोग करें। यह आपकी समस्या का समाधान करेगा।

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

3
यह मेरे लिए छोटे से बदलाव के साथ काम किया है encoding='utf-8', इसलिए मुझे लगता है कि कभी-कभी आपको कुछ चीजों को आजमाने की जरूरत होती है।
रॉबर्टमाइंस

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
रोलेंट

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

मेरे पास अनुरोधों का उपयोग करके वास्तव में यह समस्या थी। उनकी व्याख्या के लिए क्रिस्टोफ़ रूसो को धन्यवाद।

डिबग करने के लिए, मैंने उपयोग किया:

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

मुझे एपीआई से 404 प्रतिसाद वापस मिल रहा था।


1
इसे सरल किया जा सकता है response.status_codeया print(response.status_code)
टाइटनफाइटर

1

मुझे अनुरोधों (अजगर पुस्तकालय) के साथ भी यही समस्या थी। ऐसा ही हुआaccept-encoding हेडर के रूप में ।

इसे इस तरह से सेट किया गया था: 'accept-encoding': 'gzip, deflate, br'

मैंने इसे केवल अनुरोध से हटा दिया और त्रुटि प्राप्त करना बंद कर दिया।


1

मेरे लिए, यह अनुरोध में प्रमाणीकरण का उपयोग नहीं कर रहा था।


1

मेरे लिए यह 200 के अलावा किसी अन्य चीज़ के साथ सर्वर रिस्पॉन्स कर रहा था और प्रतिक्रिया जसन स्वरूपित नहीं थी। मैंने जस्सन पार्स करने से पहले ऐसा किया:

# 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 (आंतरिक सर्वर त्रुटि) था, इसलिए कोई भी जसन वापस नहीं किया गया था और इसलिए जसन की पंक्ति 1 कॉल 1 में कुछ भी नहीं था। हमेशा यह जांचने के लिए अच्छा है कि अनुरोध स्थिति कोड वह है जो आप इसकी अपेक्षा करते हैं।
thposs

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

संदर्भ: ट्विटर स्ट्रीम एपीआई JSONDecodeError ("अपेक्षित मूल्य", s, इरेटी) देता है जिसमें से कोई भी नहीं है


मुझे नहीं लगता कि खाली लाइनें एक समस्या हैं। यह स्पष्ट रूप से बताता है कि त्रुटि पंक्ति 1 कॉलम 1 पर है। मुझे लगता है कि यह वर्कअराउंड काम करता है क्योंकि यह फ़ाइल से BOM निकाल रहा है। आप इसे जल्दी से सत्यापित कर सकते हैं: 1. अपनी मूल फ़ाइल का आकार जांचें (राइट क्लिक> गुण), यह 134.859 बाइट्स हो सकता है। नोटपैड ++ के साथ मूल फ़ाइल खोलें। 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

मुझे पायथन-आधारित वेब एपीआई की प्रतिक्रिया में इस तरह की त्रुटि मिली .text, लेकिन इसने मुझे यहां तक ​​पहुंचाया, इसलिए इससे दूसरों को एक समान समस्या हो सकती है (उपयोग करते समय किसी खोज में प्रतिक्रिया और अनुरोधों को फ़िल्टर करना बहुत मुश्किल है)requests ।)

पोस्ट करने से पहले JSON की एक सही ढंग से बची हुई स्ट्रिंग बनाने के json.dumps()लिए अनुरोध पर उपयोग करने से dataपहले मेरे लिए मुद्दा तय हो गया

requests.post(url, data=json.dumps(data))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.