পাইথন / জেসন: প্রত্যাশিত সম্পত্তির নামটি ডাবল উদ্ধৃতিতে আবদ্ধ


121

আমি পাইথনে জেএসএন বস্তু লোড করার জন্য একটি ভাল উপায় বের করার চেষ্টা করেছি trying আমি এই জসন ডেটা পাঠিয়েছি:

{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}

ব্যাকএন্ডে যেখানে এটি একটি স্ট্রিং হিসাবে প্রাপ্ত হবে তখন আমি json.loads(data)এটি বিশ্লেষণ করতাম।

তবে প্রতিবারই আমি একই ব্যতিক্রম পেয়েছি:

ValueError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

আমি এটি গুগল করেছিলাম তবে json.loads(json.dumps(data))ব্যক্তিগতভাবে আমার পক্ষে এতটা কার্যকর বলে মনে হচ্ছে না যে এই সমাধান ছাড়াও কিছুই কার্যকর হয় না, কারণ এটি কোনও ধরণের ডেটা এমনকি জেসন ফর্ম্যাটে নয় এমন গ্রহণযোগ্যতাও গ্রহণ করে।

কোন পরামর্শ অনেক প্রশংসা করা হবে।


21
আমার ভুলটি ডাবল উক্তি জিনিস ছিল না। পাইথনের মতো আমরা সর্বশেষ কী-মান জুটির পরে কমা যোগ করছিলাম। আপনি এটি JSON এ করবেন না।
Luv33preet

4
json.dumps()অজগর লেখার চেয়ে এবং অজগর স্বরলিপিটি আপনার জাভাস্ক্রিপ্ট পাঠক হিসাবে কাজ করবে আশা করে সর্বদা ব্যবহার করুন ।
vy32

আমার এই সমস্যাটি হয়েছিল কারণ আমি এর ফলাফল নিয়েছি print(jsonpickle_deserialized_object_string)এবং এটি ব্যবহারের চেষ্টা করেছি। কিছু কারণে print()থেকে কোট পরিবর্তন "করতে'
StingyJack

@ লুভ 33প্রীত, ধন্যবাদ, এটি সমাধান হয়েছে। তবে আমি লগার-চিহ্নটি অনুপস্থিত-কমা বা অন্য কিছু হিসাবে প্রত্যাশা করছি, তবে এই ত্রুটিটি এ সম্পর্কে কিছুই বলে না,
গণেশদেশমুখ

দেখতে stackoverflow.com/a/63862387/1497139 একটি দ্রুত ফিক্স জন্য
উলফগ্যাং Fahl

উত্তর:


162

এই:

{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}

JSON নয়।
এই:

{"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna's Homepage"}]}}

জেএসএন।

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


4
থ্যাঙ্কস :) আমি তাতে মনোযোগ দিই নি, তথ্য প্রেরণের সময় আমি সঠিক জসন ফর্ম্যাটটি ব্যবহার করছি তবে যখন এটি ব্যাকেন্ডে পাওয়া যায় তখন ডাবল উদ্ধৃতিগুলি একক দ্বারা প্রতিস্থাপিত হয়! সুতরাং আমি ব্যতিক্রম পেয়েছিলাম।
রেক্স

39
এটি কোনও সমাধান নয়। একটি সমাধান তাকে জানায় কীভাবে বৈধ জসনকে স্ট্রিংটি পরিবর্তন করতে হবে।
ফিস্টঅফফুরি

4
@ ফিস্টঅফফুরি আমি দুঃখিত তবে আপনার বক্তব্যটি মিথ্যা অনুমানের উপর ভিত্তি করে নির্বিচারে অবৈধ জেএসওএন স্ট্রিংটিকে নির্ভরযোগ্যভাবে প্রোগ্রামে কোনও বৈধতায় রূপান্তরিত করা যেতে পারে। এই প্রশ্নের জন্য প্রচুর উত্তর 'এর সাথে' এবং এর পরিবর্তে সমস্যাটি মোকাবেলা করার চেষ্টা করে I আমি কি আপনাকে ইনপুট স্ট্রিংয়ের সাধারণ উদাহরণ দিতে পারি যা এই "সমাধানগুলি" কে ভেঙে ফেলবে? স্পষ্টতই ওপি বুঝতে পেরেছিল যে আমরা যা করছি তা নয় JSON এবং অগ্রসর হতে সক্ষম হয়েছিল - আমার উত্তর গ্রহণ করেছে int ইঙ্গিত - ইনপুট স্ট্রিংটি দেখতে পাইথন ডিকের আউটপুট বলে মনে হচ্ছে __ repr __ () পদ্ধতি।
এলমোভ্যানকিয়েলমো

4
@ এলমোভ্যানকিলোমো আপনার উত্তরটি একটি প্রশ্নের বিবৃতি নয়, প্রশ্নের উত্তর নয় এমন সত্যটি পরিবর্তন করে না। আপনি কোনও প্রসঙ্গ বা ব্যাখ্যা সরবরাহ করেন না। প্রশ্ন সম্পর্কে তথ্য খুঁজছেন এখানে আসা লোকেরা হতাশ হবেন। আপনি ওপিকে সাহায্য করতে পারেন, কিন্তু অন্যরা তেমন কিছু করে না।
ফিস্টঅফফুরি

একটি সাধারণ পরিষ্কার বিবৃতি প্রায়শই অনেক সাহায্য করে। বিশেষত, যখন চারপাশে প্রচুর অন্যান্য উত্তর রয়েছে।
বেন

56

যেহেতু জেএসএন কেবলমাত্র ডাবল উদ্ধৃতি সহ স্ট্রিংগুলি ঘিরে রাখার অনুমতি দেয় আপনি তার মতো স্ট্রিংগুলি ম্যানিপুলেট করতে পারেন:

str = str.replace("\'", "\"")

যদি আপনার জেএসওএন সিগন্যাল-কোটস ( \') এড়িয়ে যায় তবে আপনার আরও নিচের সুনির্দিষ্ট কোডটি ব্যবহার করা উচিত:

import re
p = re.compile('(?<!\\\\)\'')
str = p.sub('\"', str)

এটি JSON স্ট্রিংয়ে ডাবল উদ্ধৃতি সহ একক উদ্ধৃতিগুলির সমস্ত উপস্থিতি প্রতিস্থাপন করবে strএবং পরবর্তী ক্ষেত্রে পালানো একক উদ্ধৃতি প্রতিস্থাপন করবে না।

js-beautifyযা আপনি কম কড়া তা ব্যবহার করতে পারেন :

$ pip install jsbeautifier
$ js-beautify file.js

4
কোনও ভাল ধারণা নয় কারণ এটি "এর মধ্যে যা ভুল তা সকলকে প্রতিস্থাপন করতে পারে: উদাহরণ: 'এটি খারাপ' ->" এটি "খারাপ" ->
ত্রুটিযুক্ত

@ রিহান_এমন আমি যেসব ক্ষেত্রে পালানো একক-কোট ব্যবহার করা হয় সেগুলির জন্য আমি আরও একটি সুনির্দিষ্ট রেগেক্স বিকল্প যুক্ত করেছি।
এলিগ

@ ওল্ফগ্যাংফাহল আপনি এখনই আবার চেষ্টা করতে পারেন।
এলিগ

thx আমি এখন পরিবর্তে এখন স্ট্যাকওভারফ্লো.com/a/63862387/1497139 ব্যবহার করছি
ওল্ফগ্যাং ফাহেল

আমি একটি পরীক্ষা ক্ষেত্রে testSingleQuoteToDoubleQuoteStackoverflow যোগ github.com/WolfgangFahl/pyLoDStorage/blob/master/tests/... আলোচনা প্রতি stackoverflow.com/a/63862387/1497139 এটা ফলাফলে পার্থক্য দেখায়: { 'শহর': [{ ' নাম ': "আপার হেলসের গেট"}, name' নাম ': "এন'জেটো"}] cities "শহরগুলি": [{"নাম": "আপার হেলসের গেট"}, name "নাম": "এন'জেটো }] cities "শহরগুলি": [{"নাম": "ওপার হেল" এস গেট "}, {" নাম ":" এন "জেটো"}]
ওল্ফগ্যাং ফাহল

35

আমার ক্ষেত্রে, ডাবল উদ্ধৃতিগুলির কোনও সমস্যা ছিল না।

শেষ কমা আমাকে একই ত্রুটি বার্তা দিয়েছে।

{'a':{'b':c,}}
           ^

এই কমাটি অপসারণ করতে, আমি কিছু সাধারণ কোড লিখেছি।

import json

with open('a.json','r') as f:
    s = f.read()
    s = s.replace('\t','')
    s = s.replace('\n','')
    s = s.replace(',}','}')
    s = s.replace(',]',']')
    data = json.loads(s)

এবং এটি আমার জন্য কাজ করেছে।


4
+1 আমি এটি নিশ্চিত করতে পারি। পেছনের কমা এই ত্রুটি বার্তা তৈরি করে। উদাহরণ: echo '{"json":"obj",}' | python -m json.tool শেলটি চালানোর সময়, "দ্বৈত উক্তিগুলিতে প্রত্যাশিত সম্পত্তির নাম দেওয়া হয়: লাইন 1 কলাম 15 (চর 14)" দেয়। ট্রেলিং কমাটা আইনী জেএসএন নয়, তবে পাইথন জেএসওএন মডিউলটি এই ক্ষেত্রে প্রাসঙ্গিক ত্রুটি বার্তা প্রেরণ করলে ভাল লাগবে।
ল্যারিক্স ডিসিডুয়া

8

একদম সহজভাবে, স্ট্রিংটি বৈধ JSON নয়। ত্রুটিটি যেমন বলেছে, জেএসএন নথির ডাবল উদ্ধৃতি ব্যবহার করা দরকার।

আপনাকে ডেটার উত্সটি ঠিক করতে হবে।


7

আমি আপনার JSON ডেটা পরীক্ষা করেছি

{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}

মধ্যে http://jsonlint.com/ এবং ফলাফল ছিল:

Error: Parse error on line 1:
{   'http://example.org/
--^
Expecting 'STRING', '}', got 'undefined'

নিম্নলিখিত স্ট্রিং এ এটি পরিবর্তন করে JSON ত্রুটি সমাধান করুন:

{
    "http://example.org/about": {
        "http://purl.org/dc/terms/title": [{
            "type": "literal",
            "value": "Anna's Homepage"
        }]
    }
}

4
আপনাকে এই লিঙ্কের জন্য ধন্যবাদ!
ওলভেস

7

JSON স্ট্রিং অবশ্যই ডাবল উদ্ধৃতি ব্যবহার করা উচিত। JSON পাইথন লাইব্রেরি এটি প্রয়োগ করে যাতে আপনি আপনার স্ট্রিং লোড করতে অক্ষম হন। আপনার ডেটা এর মতো দেখতে হবে:

{"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna's Homepage"}]}}

যদি এটি কিছু না করতে পারেন তবে আপনি তার ast.literal_eval()পরিবর্তে ব্যবহার করতে পারেনjson.loads()


4
এটি পাইথন গ্রন্থাগারের কোনও বিধিনিষেধ নয়, নিজেই JSON ফর্ম্যাট।
ড্যানিয়েল রোজম্যান

আপনি সঠিক. যাইহোক, কিছু জেএসএন পার্সার ডাবল উদ্ধৃতি প্রয়োগ করে না। আমি আমার উত্তর আপডেট করব।
অ্যালেক্সব্লে

এই নন- json.loads()
জেএসএন

4
ব্যবহার ast.literal_evalপরিণাম ডেকে আনবে ValueError: malformed stringযদি JSON স্ট্রিংকে একটি বুলিয়ান মান আছে।
স্ক্র্যাচ'ন 'পুর

4
import ast

inpt = {'http://example.org/about': {'http://purl.org/dc/terms/title':
                                     [{'type': 'literal', 'value': "Anna's Homepage"}]}}

json_data = ast.literal_eval(json.dumps(inpt))

print(json_data)

এটি সমস্যার সমাধান করবে।


3

এটি স্পষ্টতই ত্রুটিতে বলেছে, নামগুলি একক উদ্ধৃতিগুলির পরিবর্তে ডাবল কোটে যুক্ত হওয়া উচিত। আপনি যে স্ট্রিংটি পাস করেছেন তা কেবল একটি বৈধ JSON নয়। এটি দেখতে হবে

{"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna's Homepage"}]}}

2

আমি এই পদ্ধতিটি ব্যবহার করেছি এবং পছন্দসই আউটপুট পেতে সক্ষম হয়েছি। আমার স্ক্রিপ্ট

x = "{'inner-temperature': 31.73, 'outer-temperature': 28.38, 'keys-value': 0}"

x = x.replace("'", '"')
j = json.loads(x)
print(j['keys-value'])

আউটপুট

>>> 0

2
with open('input.json','r') as f:
    s = f.read()
    s = s.replace('\'','\"')
    data = json.loads(s)

এটি আমার পক্ষে পুরোপুরি ভাল কাজ করেছে। ধন্যবাদ


2
x = x.replace("'", '"')
j = json.loads(x)

যদিও এটি সঠিক সমাধান, তবে এটির মতো কোনও জেএসওএন থাকলে এটি বেশ মাথা ব্যথার কারণ হতে পারে -

{'status': 'success', 'data': {'equity': {'enabled': True, 'net': 66706.14510000008, 'available': {'adhoc_margin': 0, 'cash': 1277252.56, 'opening_balance': 1277252.56, 'live_balance': 66706.14510000008, 'collateral': 249823.93, 'intraday_payin': 15000}, 'utilised': {'debits': 1475370.3449, 'exposure': 607729.3129, 'm2m_realised': 0, 'm2m_unrealised': -9033, 'option_premium': 0, 'payout': 0, 'span': 858608.032, 'holding_sales': 0, 'turnover': 0, 'liquid_collateral': 0, 'stock_collateral': 249823.93}}, 'commodity': {'enabled': True, 'net': 0, 'available': {'adhoc_margin': 0, 'cash': 0, 'opening_balance': 0, 'live_balance': 0, 'collateral': 0, 'intraday_payin': 0}, 'utilised': {'debits': 0, 'exposure': 0, 'm2m_realised': 0, 'm2m_unrealised': 0, 'option_premium': 0, 'payout': 0, 'span': 0, 'holding_sales': 0, 'turnover': 0, 'liquid_collateral': 0, 'stock_collateral': 0}}}}

লক্ষ্য করেছি যে, "সত্য" মূল্য কত? বুলিয়ানদের জন্য জিনিসগুলি দ্বিগুণ পরীক্ষা করাতে এটি ব্যবহার করুন। এটি সেই কেসগুলি কভার করবে -

x = x.replace("'", '"').replace("True", '"True"').replace("False", '"False"').replace("null", '"null"')
j = json.loads(x)

এছাড়াও, নিশ্চিত নাও যে আপনি তৈরি করছেন না

x = json.loads(x)

এটি অন্য পরিবর্তনশীল হতে হবে।


1

আমারও একই সমস্যা ছিল একে অপরের সাথে যোগাযোগ করার দুটি উপাদান একটি সারি ব্যবহার করছিল।

প্রথম উপাদানটি কাতারে বার্তা দেওয়ার আগে json.dumps করছে না। সুতরাং উপাদান গ্রহণ করে উত্পন্ন JSON স্ট্রিংটি একক উদ্ধৃতিতে ছিল। এটি ত্রুটি সৃষ্টি করছিল

 Expecting property name enclosed in double quotes

জসন.ডাম্পস যুক্ত করা সঠিকভাবে ফর্ম্যাট করা জেএসওএন এবং সমাধান করা সমস্যা তৈরি করা শুরু করে।


0

evalফাংশনটি ব্যবহার করুন ।

এটি একক এবং ডাবল উদ্ধৃতিগুলির মধ্যে পার্থক্যটির যত্ন নেয়।


ব্যবহারকারীর ইনপুট বা এইচটিটিপি অনুরোধের সাথে উপাত্ত আসবে না ev এটি একটি বিশাল সুরক্ষা সমস্যা।
এলমোভ্যানকিয়েলমো

0

অন্যান্য উত্তরগুলি ভালভাবে ব্যাখ্যা করার সাথে সাথে জাসন মডিউলটিতে অবৈধ উদ্ধৃতি অক্ষরগুলির কারণে ত্রুটি ঘটে।

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

 “  ”  ‛  ’  ‘  `  ´  ″  ′ 

এগুলি পরিষ্কার করতে আপনি কেবল নিজের স্ট্রিংটি একটি নিয়মিত অভিব্যক্তির মধ্য দিয়ে যেতে পারেন:

import re

raw_string = '{“key”:“value”}'

parsed_string = re.sub(r"[“|”|‛|’|‘|`|´|″|′|']", '"', my_string)

json_object = json.loads(parsed_string)


-1

আমি যখন JSON হাতে সম্পাদনা করেছি তখন আমি একাধিকবার এই সমস্যায় পড়েছি। কেউ যদি লক্ষ্য না করেই ফাইল থেকে কিছু মুছতে থাকে তবে একই ত্রুটিটি ফেলে দিতে পারে।

উদাহরণস্বরূপ, যদি আপনার JSON সর্বশেষ "}" অনুপস্থিত থাকে তবে এটি একই ত্রুটিটি ফেলে দেবে।

সুতরাং আপনি যদি নিজের হাতে ফাইল সম্পাদনা করেন তবে নিশ্চিত হয়ে নিন যে আপনি এটির মতো ফর্ম্যাট করেছেন যেমন এটি JSON ডিকোডার দ্বারা প্রত্যাশিত, অন্যথায় আপনি একই সমস্যার মধ্যে চলে যাবেন।

আশাকরি এটা সাহায্য করবে!


-2

json.dumps()পদ্ধতিটি ব্যবহার করা সর্বদা আদর্শ । এই ত্রুটি থেকে মুক্তি পেতে আমি নিম্নলিখিত কোডটি ব্যবহার করেছি

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