"কোনও জেএসওএন অবজেক্ট ডিকোড করা যায় না" এর চেয়ে ভাল ত্রুটির বার্তা প্রদর্শন করা হচ্ছে


128

কিছু দীর্ঘ জটিল জেএসওএন ফাইল থেকে ডেটা লোড করার জন্য পাইথন কোড:

with open(filename, "r") as f:
  data = json.loads(f.read())

(দ্রষ্টব্য: সর্বোত্তম কোড সংস্করণটি হওয়া উচিত:

with open(filename, "r") as f:
  data = json.load(f)

তবে উভয়ই একই রকম আচরণ দেখায়)

অনেক ধরণের জেএসওন ত্রুটির জন্য (ডেলিমেটারগুলি অনুপস্থিত, স্ট্রিংগুলিতে ভুল ব্যাকস্ল্যাশগুলি ইত্যাদি), এটি জাসন ত্রুটিটি পাওয়া গেছে সেখানে লাইন এবং কলাম নম্বর সম্বলিত একটি দুর্দান্ত সহায়ক বার্তা মুদ্রণ করে।

তবে, অন্যান্য ধরণের জেএসওন ত্রুটির জন্য ("তালিকার শেষ আইটেমটিতে কমা ব্যবহার করে ক্লাসিক সহ", তবে সত্য / মিথ্যাটিকে মূলধন দেওয়ার মতো অন্যান্য জিনিসও রয়েছে), পাইথনের আউটপুটটি কেবল:

Traceback (most recent call last):
  File "myfile.py", line 8, in myfunction
    config = json.loads(f.read())
  File "c:\python27\lib\json\__init__.py", line 326, in loads
    return _default_decoder.decode(s)
  File "c:\python27\lib\json\decoder.py", line 360, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "c:\python27\lib\json\decoder.py", line 378, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

এই ধরণের ভ্যালুআরারের জন্য, জেএসওএন ফাইলটিতে ত্রুটি কোথায় রয়েছে তা আপনি কীভাবে পাইথন পাবেন?


আপনি কি আপনার ফাইলের একটি অংশ ফেলে দিতে পারেন?
কেটুইম

আমি এখন কোনও নির্দিষ্ট ফাইলে ত্রুটিটি অনুসন্ধান করার চেষ্টা করছি না; আমি আমার প্রোগ্রামটি পরিবর্তন করার চেষ্টা করছি যাতে এটি ভবিষ্যতে যে কোনও ফাইলের পড়লে ত্রুটিটি হাইলাইট হয়ে যায়।
ওজেডাব্লু

2
সরাসরি সম্পর্কিত নয়, তবে আপনি কেবল তার json.load(f)পরিবর্তে এটি করতে পারেনjson.loads(f.read())
মার্টিন স্যামসন

@ ওজেডাব্লু এই আচরণটি অজগরটির কোন সংস্করণে ছিল?
jxramos

পাইথন 3.8.1 এখন ত্রুটির অবস্থানটি দেয় "প্রত্যাশিত মান: লাইন 1 কলাম 21 (চার 20)"
ওজেডাব্লু

উত্তর:


173

আমি খুঁজে পেয়েছি যে simplejsonবিল্ট-ইন jsonমডিউলটি অস্পষ্ট যেখানে অনেক ক্ষেত্রে মডিউলটি আরও বর্ণনামূলক ত্রুটি দেয় । উদাহরণস্বরূপ, একটি তালিকার শেষ আইটেমের পরে কমা থাকার ক্ষেত্রে:

json.loads('[1,2,]')
....
ValueError: No JSON object could be decoded

যা খুব বর্ণনামূলক নয়। একই অপারেশন simplejson:

simplejson.loads('[1,2,]')
...
simplejson.decoder.JSONDecodeError: Expecting object: line 1 column 5 (char 5)

অনেক ভাল! একইভাবে অন্যান্য সাধারণ ত্রুটির জন্য যেমন মূলধন True


18
পাইথনের ভবিষ্যতের সংস্করণগুলিতে এই উন্নতিগুলি অন্তর্ভুক্ত থাকবে; এটি নীচে একই প্রকল্প।
মার্টিজন পিটারস


1
@ user2016290 কোর / প্যাকেজ ফাইলগুলি সরাসরি সম্পাদনা করা একটি খারাপ ধারণা। পাইথন বানর প্যাচ করা সহজ, সুতরাং কোডে এটি করা ভাল।
Rebs

2
@ জ্যাক্স্রামোস: ওপি পাইথন ২.7 ব্যবহার করেছে, এটি ট্রেসব্যাক থেকে প্রমাণিত। আইডোন.কম (পাইথন ৩.7.৩) এর একটি দ্রুত পরীক্ষা দেখায় যে stdlib jsonগ্রন্থাগারটি আপডেট করা হয়েছে এবং নতুন ত্রুটি বার্তার বিন্যাস দেয়। আমার কাছে এখনই ঠিক রিলিজ ট্র্যাক করার সময় নেই।
মার্টিজন পিটারস

1
: @jxramos দেখা যায়, পাইথন 3.5 ব্যতিক্রম আপডেট bugs.python.org/issue19361 (মাধ্যমে docs.python.org/3/whatsnew/3.5.html#improved-modules )।
মার্তিজান পিটারস

15

আপনি JSON কোথায় ভুল তা জানাতে আপনি অজগর পেতে সক্ষম হবেন না। অনলাইনে এই জাতীয় কোথাও আপনাকে একটি লিটার ব্যবহার করতে হবে

এটি আপনাকে JSON এ ত্রুটি দেখাবে যা আপনি ডিকোড করার চেষ্টা করছেন।


2
এমন কোনও অফলাইন সরঞ্জাম রয়েছে যা গোপনীয় JSON ফাইলগুলির জন্য এটি করতে পারে?
ওজেডাব্লু

@ ওজেডাব্লু এটা নয় যে আমি জানি তবে এর ফলে আপনার যে সমস্যা হচ্ছে তা সমাধান করা উচিত বা কমপক্ষে আপনাকে আপনার ভাঙা জসন ঠিক করতে দেওয়া উচিত।
myusuf3

12
আমার JSON ফাইলটি ভাল - আমি আমার প্রোগ্রামটি প্রিন্টের জন্য দরকারী ত্রুটি বার্তাগুলি প্রিন্ট করার চেষ্টা করছি যা কারও কাছে বোধগম্য। তাদের "লিঙ্ক 13 কলাম 32 এ কমা থেকে মুক্তি পান" বলা ভাল। তাদের বলা "আপনার ফাইলের কোথাও একটি ত্রুটি রয়েছে, দয়া করে এটি ইন্টারনেটে আপলোড করুন যেখানে লোকেরা আপনাকে সহায়তা করবে" খারাপ is
ওজেডাব্লু

7

আপনি চেষ্টা করে দেখতে পারেন rson লাইব্রেরিটি এখানে পাওয়া যায়নি: http://code.google.com/p/rson/ । আমি এটি পিওয়াইপিআই: https://pypi.python.org/pypi/rson/0.9 এও আপ করছি যাতে আপনি এটি পেতে ইজি_ইনস্টল বা পাইপ ব্যবহার করতে পারেন।

টম দ্বারা প্রদত্ত উদাহরণের জন্য:

>>> rson.loads('[1,2,]')
...
rson.base.tokenizer.RSONDecodeError: Unexpected trailing comma: line 1, column 6, text ']'

আরএসওন হ'ল জেএসওএন-এর সুপারস্টেট হিসাবে নকশাকৃত, যাতে এটি JSON ফাইলগুলি পার্স করতে পারে। এটিতে একটি বিকল্প বাক্য গঠন রয়েছে যা মানুষের দেখার এবং সম্পাদনার জন্য খুব সুন্দর। আমি ইনপুট ফাইলগুলির জন্য এটি বেশ খানিকটা ব্যবহার করি।

বুলিয়ান মানগুলির মূলধন হিসাবে: এটি প্রদর্শিত হয় যে আরসন ভুলভাবে মূলধনী বুলিয়ানগুলি স্ট্রিং হিসাবে পড়ে।

>>> rson.loads('[true,False]')
[True, u'False']

4

আমারও একই সমস্যা ছিল এবং এটি সিঙ্গলকোটের কারণে হয়েছিল। জেএসএন স্ট্যান্ডার্ড ( http://json.org ) কেবলমাত্র ডাবল উদ্ধৃতিগুলি ব্যবহার করার বিষয়ে কথা বলে যাতে অজগর jsonগ্রন্থাগারটি কেবল ডাবল উদ্ধৃতি সমর্থন করে।


3

এই সমস্যাটির আমার বিশেষ সংস্করণের জন্য, আমি এগিয়ে গিয়ে ফাইলের load_json_file(path)মধ্যে ফাংশন ঘোষণার অনুসন্ধান করেছি packaging.py, তারপরে একটি printলাইন পাচার করেছি:

def load_json_file(path):
    data = open(path, 'r').read()
    print data
    try:
        return Bunch(json.loads(data))
    except ValueError, e:
        raise MalformedJsonFileError('%s when reading "%s"' % (str(e),
                                                               path))

এই পদ্ধতিতে এটি চেষ্টা করার আগে প্রবেশ করার আগে জসন ফাইলের বিষয়বস্তু মুদ্রণ করবে, এবং এইভাবে - এমনকি আমার সবেমাত্র পাইথন জ্ঞান থাকা সত্ত্বেও - আমার কনফিগারেশনটি কেন জেএসন ফাইলটি পড়তে পারে না তা আমি দ্রুতই বুঝতে পেরেছিলাম।
(এটি ছিল কারণ আমি আমার পাঠ্য সম্পাদককে একটি ইউটিএফ -8 বিওএম লিখতে ... বোকা)

কেবল এটি উল্লেখ করার কারণে, যদিও ওপি'র নির্দিষ্ট সমস্যার কোনও ভাল উত্তর নাও থাকতে পারে, তবে এটি অত্যন্ত অত্যাচারী বাগের উত্স নির্ধারণের জন্য একটি দ্রুত পদ্ধতি ছিল। এবং আমি বাজি ধরেছি যে অনেকে এই নিবন্ধটিতে হোঁচট খাবেন যারা এ এর ​​জন্য আরও ভার্জোজ সমাধান সন্ধান করছেন MalformedJsonFileError: No JSON object could be decoded when reading …। যাতে তাদের সাহায্য করতে পারে।


আই / ও ( with open(fn) as f) ফাইলের জন্য আপনার কনটেক্সট ম্যানেজার ব্যবহার করা উচিত , এটি আপনার ব্যতিক্রম হিসাবে ফাইলটি বন্ধ করে দেয়। en.wikibooks.org/wiki/Python_Programming/…
রেবস

1
+1 টি। যদি আপনি স্ট্যান্ডার্ড আচরণের উপর বানরকিপাচের কোনও উদাহরণ দেখাতে পারেন তবে তা খুব ঝরঝরে হতে পারে
ক্রেগ ব্রেট

দুঃখিত, সমস্যাটি ধরা পড়ার পরে আমি কখনই কোনও পাইথন কোড স্পর্শ করি নি। হয়তো অন্য কেউ সাহায্য করতে পারেন?
উড্রোশিগেরু

3

আমার হিসাবে, আমার জেসন ফাইলটি খুব বড়, যখন পাইথনটিতে সাধারণ ব্যবহার হয় jsonএটি উপরের ত্রুটিটি পায়।

পরে ইনস্টল simplejsonদ্বারা sudo pip install simplejson

এবং তারপর আমি এটি সমাধান।

import json
import simplejson


def test_parse_json():
    f_path = '/home/hello/_data.json'
    with open(f_path) as f:
        # j_data = json.load(f)      # ValueError: No JSON object could be decoded
        j_data = simplejson.load(f)  # right
    lst_img = j_data['images']['image']
    print lst_img[0]


if __name__ == '__main__':
    test_parse_json()

1

আমার অনুরূপ সমস্যাটি ছিল আমার কোড:

    json_file=json.dumps(pyJson)
    file = open("list.json",'w')
    file.write(json_file)  

    json_file = open("list.json","r")
    json_decoded = json.load(json_file)
    print json_decoded

সমস্যাটি ছিল আমি ভুলে গিয়েছিলাম এটি file.close() করেছিলাম এবং সমস্যাটি স্থির করেছিলাম।


আমার জন্যও কাজ করেছেন, জানেন না কেন আগে এই সমস্যা হয়নি।
pceccon

আই / ও ( with open(fn) as f) ফাইলের জন্য আপনার কনটেক্সট ম্যানেজার ব্যবহার করা উচিত , এটি আপনার ব্যতিক্রম হিসাবে ফাইলটি বন্ধ করে দেয়। en.wikibooks.org/wiki/Python_Programming/…
রেবস

0

গৃহীত উত্তরটি সমস্যার সমাধান করা সবচেয়ে সহজ। তবে আপনার কোম্পানির নীতিমালার কারণে আপনি যদি সিম্পজসন ইনস্টল করার অনুমতি না পেয়ে থাকেন তবে "তালিকার শেষ আইটেমটিতে কমা ব্যবহার করে" নির্দিষ্ট সমস্যাটি সমাধান করার জন্য আমি নীচের সমাধানটি প্রস্তাব করছি :

  1. "JSONDecoder" ক্লাস থেকে উত্তরাধিকার সূত্রে একটি শিশু শ্রেণি "JSONLintCheck" তৈরি করুন এবং "JSONDecoder" শ্রেণীর আরম্ভ পদ্ধতিটি নীচের মতো ওভাররাইড করুন :

    def __init__(self, encoding=None, object_hook=None, parse_float=None,parse_int=None, parse_constant=None, strict=True,object_pairs_hook=None)        
            super(JSONLintCheck,self).__init__(encoding=None, object_hook=None,      parse_float=None,parse_int=None, parse_constant=None, strict=True,object_pairs_hook=None)
            self.scan_once = make_scanner(self)
  1. Make_scanner একটি নতুন ফাংশন যা উপরের শ্রেণীর 'স্ক্যান_অনস' পদ্ধতিটিকে ওভাররাইড করতে ব্যবহৃত হয়। এবং এটির জন্য এখানে কোড :
  1 #!/usr/bin/env python
  2 from json import JSONDecoder
  3 from json import decoder
  4 import re
  5
  6 NUMBER_RE = re.compile(
  7     r'(-?(?:0|[1-9]\d*))(\.\d+)?([eE][-+]?\d+)?',
  8     (re.VERBOSE | re.MULTILINE | re.DOTALL))
  9
 10 def py_make_scanner(context):
 11     parse_object = context.parse_object
 12     parse_array = context.parse_array
 13     parse_string = context.parse_string
 14     match_number = NUMBER_RE.match
 15     encoding = context.encoding
 16     strict = context.strict
 17     parse_float = context.parse_float
 18     parse_int = context.parse_int
 19     parse_constant = context.parse_constant
 20     object_hook = context.object_hook
 21     object_pairs_hook = context.object_pairs_hook
 22
 23     def _scan_once(string, idx):
 24         try:
 25             nextchar = string[idx]
 26         except IndexError:
 27             raise ValueError(decoder.errmsg("Could not get the next character",string,idx))
 28             #raise StopIteration
 29
 30         if nextchar == '"':
 31             return parse_string(string, idx + 1, encoding, strict)
 32         elif nextchar == '{':
 33             return parse_object((string, idx + 1), encoding, strict,
 34                 _scan_once, object_hook, object_pairs_hook)
 35         elif nextchar == '[':
 36             return parse_array((string, idx + 1), _scan_once)
 37         elif nextchar == 'n' and string[idx:idx + 4] == 'null':
 38             return None, idx + 4
 39         elif nextchar == 't' and string[idx:idx + 4] == 'true':
 40             return True, idx + 4
 41         elif nextchar == 'f' and string[idx:idx + 5] == 'false':
 42             return False, idx + 5
 43
 44         m = match_number(string, idx)
 45         if m is not None:
 46             integer, frac, exp = m.groups()
 47             if frac or exp:
 48                 res = parse_float(integer + (frac or '') + (exp or ''))
 49             else:
 50                 res = parse_int(integer)
 51             return res, m.end()
 52         elif nextchar == 'N' and string[idx:idx + 3] == 'NaN':
 53             return parse_constant('NaN'), idx + 3
 54         elif nextchar == 'I' and string[idx:idx + 8] == 'Infinity':
 55             return parse_constant('Infinity'), idx + 8
 56         elif nextchar == '-' and string[idx:idx + 9] == '-Infinity':
 57             return parse_constant('-Infinity'), idx + 9
 58         else:
 59             #raise StopIteration   # Here is where needs modification
 60             raise ValueError(decoder.errmsg("Expecting propert name enclosed in double quotes",string,idx))
 61     return _scan_once
 62
 63 make_scanner = py_make_scanner
  1. নতুন শিশু শ্রেণীর সাথে 'মেক_স্ক্যানার' ফাংশনটি একত্রে ফাইলে রাখা ভাল।

0

কেবল একই সমস্যাটি চাপুন এবং আমার ক্ষেত্রে সমস্যাটি BOMফাইলের শুরুতে (বাইট অর্ডার চিহ্ন) সম্পর্কিত ছিল ।

json.tool আমি UTF BOM চিহ্ন অপসারণ না করা পর্যন্ত খালি ফাইল (কেবল কোঁকড়ানো ধনুর্বন্ধনী) প্রক্রিয়াকরণ করতে অস্বীকার করবে।

আমি যা করেছি তা হ'ল:

  • ভিএম দিয়ে আমার জেসন ফাইলটি খুলল,
  • বাইট অর্ডার চিহ্ন সরানো ( set nobomb)
  • ফাইল সংরক্ষণ

এটি json.tool দিয়ে সমস্যার সমাধান করেছে। আশাকরি এটা সাহায্য করবে!


-1

যখন আপনার ফাইলটি তৈরি হবে। পরিবর্তে বিষয়বস্তু দিয়ে একটি ফাইল তৈরি খালি। প্রতিস্থাপন:

json.dump({}, file)

-3

আপনি সিজেসন ব্যবহার করতে পারেন , যা খাঁটি-পাইথন বাস্তবায়নের চেয়ে 250 গুণ বেশি গতিযুক্ত বলে দাবি করে, আপনার "কিছু দীর্ঘ জটিল জেএসওএন ফাইল" রয়েছে এবং সম্ভবত এটি বেশ কয়েকবার চালানোর প্রয়োজন হবে (ডিকোডার ব্যর্থ হয়ে প্রথম ত্রুটির কথা জানায় তারা কেবল মুখোমুখি)।

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