JSONDecodeError: প্রত্যাশার মান: লাইন 1 কলাম 1 (চার্ট 0)


258

Expecting value: line 1 column 1 (char 0)JSON ডিকোড করার চেষ্টা করার সময় আমি ত্রুটি পাচ্ছি ।

আমি API টির জন্য যে 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আপনি যখন কেবল স্টডিলিব json(যা একই লাইব্রেরিটি হিসাবেsimplejson ব্যবহার করতে পারেন) ব্যবহার করতে পারেন কেন ?
মার্টিজন পিটারস

3
এটি একটি খালি স্ট্রিং। আপনার web_fetch() কল ব্যর্থ হয়েছে।
মার্টিজন পিটারস

1
হ্যাঁ, আমি এর চেয়ে আরও সহজ কিছু ব্যবহার করার পরামর্শ দিচ্ছি pycurlrequestsএকটি খুব সহজ এপিআই সরবরাহ করে, বিশেষত যখন এটি চলমান ডিবাগিংয়ের ক্ষেত্রে আসে। যতক্ষণ না আপনি বিশেষভাবে আছে এর একটি নতুন সংস্করণ আছে simplejsonগ্রন্থাগার, শুধু দিয়ে বিদ্ধ json, আপনি পরিচালনা করতে নির্ভরশীলতার পরিমাণ সঞ্চয় হয়।
মার্টিজন পিটারস

1
হয় response_jsonফেরত মান .json()? তারপরে আপনার কাছে ইতিমধ্যে ডিকোডড ডেটা রয়েছে এবং json.loads()আর ব্যবহার করার দরকার নেই। responseএটি আপনার জন্য ডিকোড করুন
মার্টিজন পিটারস

উত্তর:


123

মন্তব্যে কথোপকথনের সংক্ষিপ্তসার হিসাবে:

  • simplejsonলাইব্রেরি ব্যবহার করার দরকার নেই , একই পাঠাগারটি পাইথনের সাথে jsonমডিউল হিসাবে অন্তর্ভুক্ত ।

  • ইউটিএফ 8 থেকে ইউনিকোডে কোনও প্রতিক্রিয়া ডিকোড করার দরকার নেই, simplejson/ json .loads()পদ্ধতিটি ইউটিএফ 8 এনকোডড ডেটা স্থানীয়ভাবে পরিচালনা করতে পারে।

  • pycurlএকটি খুব প্রত্নতাত্ত্বিক এপিআই রয়েছে। এটি ব্যবহারের জন্য আপনার নির্দিষ্ট প্রয়োজনীয়তা না থাকলে আরও ভাল পছন্দ রয়েছে।

requestsJSON সমর্থন সহ সর্বাধিক বন্ধুত্বপূর্ণ এপিআই সরবরাহ করে। যদি আপনি পারেন তবে আপনার কলটি এর সাথে প্রতিস্থাপন করুন:

import requests

return requests.get(url).json()

93
আমি ব্যবহার করে এই একই ত্রুটি পাচ্ছি requests! ট্রেসটি মনে করে যে requestsব্যবহারগুলি complexjsonব্যবহার করে simplejson। রহস্যময়।
রায়ু

@ রায়ু: অনুরোধগুলি উপলব্ধ থাকলে ব্যবহার করবেsimplejson ; কিছু লোক পাইথন স্টাডলিবের সাথে ব্যান্ডেল করা না হয়ে সর্বশেষতম সিম্পজসন রিলিজটি ব্যবহার করতে চায়।
মার্টিজন পিটারস

5
"সিম্পজসন লাইব্রেরি ব্যবহার করার দরকার নেই, একই লাইব্রেরিকে পাইথনের সাথে জসন মডিউল হিসাবে অন্তর্ভুক্ত করা হয়েছে।" ... আমি শ্রদ্ধার সাথে একমত নই। হুডের simplejsonঅন্তর্নির্মিতটি ব্যবহার করে jsonতবে আরও বর্ণনামূলক ত্রুটি দেয়। এই ক্ষেত্রে ব্যবহার করা jsonআপনাকে কেবল একটি জেনেরিক দেবে ValueError: No JSON object could be decoded
বোল্টজম্যানব্রেন

2
এটি কি কোনও গর্ভপাত বা অসম্পূর্ণ জসন দ্বারা সৃষ্ট হতে পারে? আমি এটি এলোমেলোভাবে একবারে পেয়েছি, কীভাবে এটি পুনরুত্পাদন করতে হবে তা নিশ্চিত নয়।
ক্রিস্টোফ রাউসি

2
@ ক্রিস্টোফেরসি: হ্যাঁ, এটি বরং প্রশ্নের মূল বিষয় (ওপি একটি ফাঁকা u'' প্রতিক্রিয়া পেয়েছে )। আপনার JSONDecodeErrorবলছে যে কোনও ত্রুটি হওয়ার আগে অনেক ডেটা সফলভাবে পার্স করা হয়েছিল; এটি হতে পারে কারণ সেই সময়টিতে অবৈধ ডেটা রয়েছে (ত্রুটিযুক্ত বা JSON নথি দূষিত) বা ডেটা কেটে গেছে।
মার্টিজান পিটারস

64

প্রতিক্রিয়া ডেটা-বডিটি পরীক্ষা করুন, প্রকৃত ডেটা উপস্থিত রয়েছে কি না এবং একটি ডেটা-ডাম্প ভাল ফর্ম্যাটেড বলে মনে হচ্ছে।

বেশিরভাগ ক্ষেত্রে আপনার json.loads- JSONDecodeError: Expecting value: line 1 column 1 (char 0)ত্রুটির কারণে রয়েছে:

  • নন- JSON অনুসারে উদ্ধৃতি
  • এক্সএমএল / এইচটিএমএল আউটপুট (এটি, <টি দিয়ে শুরু হওয়া একটি স্ট্রিং) বা
  • বেমানান চরিত্রের এনকোডিং

শেষ পর্যন্ত ত্রুটিটি আপনাকে বলেছে যে প্রথম অবস্থানে স্ট্রিংটি ইতিমধ্যে 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()জাস্ট ওয়ার্কস, জেএসএন কোনওভাবেই ত্রুটিযুক্ত নয়।
মার্টিজন পিটারস

JSONDecodeError: Expecting value: line 1 column 1 (char 0)
জেসন ডিকোডে

JSONDecodeError: Expecting value: line 1 column 1 (char 0)যখন জসন প্রতিক্রিয়ার প্রথম লাইনটি অবৈধ হয় তখনও ঘটে। একটি az cliকমান্ড চালানো থেকে উদাহরণ প্রতিক্রিয়া হয় ["WARNING: The default kind for created storage account will change to 'StorageV2' from 'Storage' in the future", '{',। এটি আমাকে এখানে নিয়ে যাওয়ার ত্রুটি দিয়েছে। বাকি প্রতিক্রিয়াগুলি একটি বৈধ জেসন অবজেক্ট। ঠিক সেই প্রথম লাইনে জিনিসগুলি ভেঙে যায়।
সিডুড

34

আপনার যখন 404 এর মতো কোনও HTTP ত্রুটি কোড থাকে এবং JSON হিসাবে প্রতিক্রিয়াটি পার্স করার চেষ্টা করবেন তখন এই requestsলিবিবটি JSONDecodeErrorঘটতে পারে!

আপনাকে প্রথমে 200 (ঠিক আছে) যাচাই করতে হবে বা এই কেসটি এড়াতে ত্রুটি বাড়িয়ে তুলতে হবে। আমি আশা করি এটি একটি কম রহস্যজনক ত্রুটি বার্তা দিয়ে ব্যর্থ হয়েছে।

উল্লেখ্য : যেমন Martijn Pieters মন্তব্য সার্ভার বিবৃত করতে তাই চেক, ত্রুটি (এটা বাস্তবায়ন উপর নির্ভর করে) ক্ষেত্রে JSON সঙ্গে সাড়া Content-Typeহেডার আরো নির্ভরযোগ্য।


পুরানো মন্তব্যের জন্য দুঃখিত, তবে আপনি কি উদাহরণের সাথে লিঙ্ক করতে পারেন? আমি "দক্ষতা প্রয়োগ" থেকে আমার দক্ষতা নেওয়ার চেষ্টা করছি, "ক্রিয়া সম্পাদন করার প্রচেষ্টা, প্রতিক্রিয়া ফিরিয়ে আনতে, সেই অনুযায়ী প্রতিক্রিয়া জানাতে"।
ডিসিসি ক্লাসিকস

@dcclassics: উদাহরণ: এটি সার্ভার-সাইডে ব্যর্থ হয় এবং সার্ভারটি JSON এর সাথে উত্তর না দিয়ে একটি ত্রুটি পৃষ্ঠা (এইচটিএমএল) দেখিয়ে প্রতিক্রিয়া জানায়, সুতরাং উত্তরটি বিশ্লেষণকারী কোডটি JSON পড়ার চেষ্টা করবে তবে এইচটিএমএল ট্যাগগুলিতে ব্যর্থ হবে।
ক্রিস্টোফ রাউসি

1
সার্ভারগুলি ত্রুটি প্রতিক্রিয়াগুলিতে JSON বডি অন্তর্ভুক্ত করতে এবং করতে পারে। এটি কেবল 200 ওকে প্রতিক্রিয়া নয়। আপনি সামগ্রী-প্রকারের শিরোনামটি পরীক্ষা করতে চান।
মার্টিজন পিটারস

29

মানসিক সুস্থতা চেক তা নিশ্চিত করার জন্য আপনি আসলে invoking করছি উপযোগী হতে পারে - আমি উল্লেখ এটা মূল্য যে ক্ষেত্রে যেখানে আপনি একটি 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)

ঠিক আছে .. এটা মাঝে মাঝে হয়। ধন্যবাদ এটি বিটিডব্লিউ কাজ করেছে।
শচীন কুমার

আমি মনে করি 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
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

অনুরোধগুলি ব্যবহার করে আমার ঠিক এই সমস্যাটি ছিল। ক্রিস্টোফ রাউসিকে তার ব্যাখ্যার জন্য ধন্যবাদ।

ডিবাগ করতে, আমি ব্যবহার করেছি:

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 লাইনে কিছুই ছিল না। অনুরোধের স্থিতি কোডটি আপনি যা প্রত্যাশা করছেন তা যাচাই করে দেখতে সর্বদা ভাল।
নভেম্বর

0

আপনি যদি উইন্ডোজ ব্যবহারকারী হন তবে টুইপি এপিআই ডেটা অবজেক্টগুলির মধ্যে একটি খালি লাইন তৈরি করতে পারে। এই পরিস্থিতির কারণে আপনি "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

তথ্যসূত্র: টুইটার স্ট্রিম এপিআই কোনওটির থেকে জেএসওএনডিকোডেরিয়র ("প্রত্যাশিত মান", গুলি, মূল্য) দেয়


আমি মনে করি না খালি লাইনগুলি একটি সমস্যা। এটি পরিষ্কারভাবে জানিয়েছে যে ত্রুটিটি 1 টি কলামের 1 লাইনে রয়েছে I আমি মনে করি এই কার্যকারিতাটি কাজ করে কারণ এটি ফাইল থেকে বিওএম সরিয়ে দিচ্ছে। আপনি এটি দ্রুত যাচাই করতে পারেন: ১. আপনার আসল ফাইলের আকার (ডান ক্লিক করুন> বৈশিষ্ট্য) পরীক্ষা করুন, এটি ১৩৪.৮৮৯ বাইট হতে পারে ২. নোটপ্যাড ++ দিয়ে মূল ফাইলটি খুলুন "" ইউটিএফ-8-বিওএম "থেকে" এ এনকোডিং পরিবর্তন করুন " হল UTF-8 "। সংরক্ষণ করুন 4. আবার আকার পরীক্ষা করুন। এটি সিএ হতে 134.856 (3 বাইট কম)
অ্যালেক্স 75

0

অনুরোধটির একটি স্ট্যাটাস কোড 200 রয়েছে কিনা তা পরীক্ষা করে দেখুন So সুতরাং উদাহরণস্বরূপ:

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.dumps()করে যুক্তিটি ব্যবহার করুন data

requests.post(url, data=json.dumps(data))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.