पायथन / Json: डबल कोट्स में संलग्न संपत्ति के नाम की अपेक्षा करना


106

मैं पायथन में JSON ऑब्जेक्ट्स को लोड करने के लिए एक अच्छा तरीका जानने की कोशिश कर रहा हूं। मैं यह json डेटा भेजता हूं:

{'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))जो व्यक्तिगत रूप से मेरे लिए लगता है कि कुशल नहीं है क्योंकि यह किसी भी तरह के डेटा को स्वीकार करता है, जो कि json प्रारूप में नहीं हैं।

किसी भी सुझाव बहुत सराहना की जाएगी।


18
मेरी गलती दोहरी बात नहीं थी। मैं अंतिम की-वैल्यू जोड़ी के बाद कॉमा जोड़ रहा था जैसे हम अजगर में करते हैं। आप JSON में ऐसा नहीं करते हैं।
Luv33preet

4
हमेशाjson.dumps() केवल अजगर को लिखने के बजाय उपयोग करें और उम्मीद करें कि अजगर संकेतन आपके जावास्क्रिप्ट रीडर में काम करेगा।
vy32

मुझे यह समस्या थी क्योंकि मैंने इसका परिणाम लिया print(jsonpickle_deserialized_object_string)और इसका उपयोग करने की कोशिश की। किसी कारण के लिएprint()"'
StingyJack

@ Luv33preet, धन्यवाद, इसे हल किया गया। लेकिन मैं लकड़हारा-एमएस को लापता-अल्पविराम या कुछ और होने की उम्मीद करता हूं, लेकिन यह त्रुटि इसके बारे में कुछ भी नहीं बताती है,
ganeshdeshmukh

जवाबों:


147

यह:

{'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"}]}}

JSON है

EDIT:
कुछ टिप्पणीकारों ने सुझाव दिया कि उपरोक्त पर्याप्त नहीं है।
JSON विनिर्देश - RFC7159 बताता है कि एक स्ट्रिंग शुरू होती है और उद्धरण चिह्न के साथ समाप्त होती है। यही कारण है "
सिंगल क्वाउट 'का JSON में कोई अर्थपूर्ण अर्थ नहीं है और इसे केवल एक स्ट्रिंग के अंदर अनुमति दी जाती है।


4
थैंक्स :) मैंने उस पर ध्यान नहीं दिया, मैं डेटा भेजते समय सही जॅन्सन फॉर्मेट का उपयोग कर रहा हूं लेकिन जब बैकएंड पर यह प्राप्त होता है तो सिंगल लोगों द्वारा प्रतिस्थापित किया जाता है! इसलिए मुझे वह अपवाद मिला।
बजे

23
यह कोई हल नहीं है। एक समाधान उसे बताएगा कि स्ट्रिंग को वैध जसन में कैसे बदला जाए।
FistOfFury

2
@FistOfFury मुझे खेद है लेकिन आपका कथन एक गलत धारणा पर आधारित है कि मनमाने ढंग से अमान्य JSON स्ट्रिंग को भरोसेमंद रूप से एक वैध प्रोग्राम में बदल दिया जा सकता है। इस प्रश्न के उत्तर के बहुत सारे 'के साथ' और इसके स्थान पर समस्या से निपटने की कोशिश करते हैं। क्या मुझे आपको इनपुट स्ट्रिंग के सरल उदाहरण देने होंगे जो इन "समाधान" को तोड़ देंगे? जाहिर है ओपी समझ गए कि हम जो काम कर रहे हैं वह नहीं है? JSON और आगे बढ़ने में सक्षम था - मेरे उत्तर को स्वीकार कर लिया। संकेत - इनपुट स्ट्रिंग अधिक पायथन आउटपुट के समान लगती है ।__ repr __ () विधि।
ElmoVanKielmo

4
@ElmoVanKielmo इस तथ्य को नहीं बदलता है कि आपका उत्तर कथन है, प्रश्न का उत्तर नहीं। आप कोई संदर्भ या स्पष्टीकरण प्रदान करते हैं। सवाल की जानकारी के लिए यहां आने वाले लोग निराश होंगे। आपने ओपी की मदद की होगी, लेकिन अन्यों ने ऐसा नहीं किया।
FistOfFury

43

JSON केवल दोहरे उद्धरण चिह्नों के साथ तार जोड़ने की अनुमति देता है जैसे आप स्ट्रिंग को इस तरह से जोड़ सकते हैं:

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

यह सिंगल उद्धरण की सभी घटनाओं को JSON स्ट्रिंग में दोहरे उद्धरण के साथ बदल देगा str

आप यह भी उपयोग कर सकते हैं js-beautifyजो कम सख्त है:

$ pip install jsbeautifier
$ js-beautify file.js

3
यह एक अच्छा विचार नहीं है क्योंकि यह सभी को बदल सकता है जो गलत है: उदाहरण: 'यह बुरा है' -> "यह बुरा है" -> विकृत स्ट्रिंग
रेहान_मन

30

मेरे मामले में, डबल कोट्स कोई समस्या नहीं थी।

अंतिम अल्पविराम ने मुझे वही त्रुटि संदेश दिया।

{'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)" देता है। ट्रेलिंग कॉमाटा कानूनी JSON नहीं हैं, लेकिन यह अच्छा होगा यदि पायथन JSON मॉड्यूल ने इस मामले में एक प्रासंगिक त्रुटि संदेश उत्सर्जित किया।
लैरीक्स डेसीडुआ

7

काफी बस, यह स्ट्रिंग मान्य JSON नहीं है। जैसा कि त्रुटि कहती है, JSON दस्तावेज़ों को दोहरे उद्धरण चिह्नों का उपयोग करने की आवश्यकता होती है।

आपको डेटा के स्रोत को ठीक करने की आवश्यकता है।


6

मैंने आपका 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"
        }]
    }
}

2
उस लिंक के लिए आपको धन्यवाद!
वोल्वेस

6

JSON स्ट्रिंग्स को दोहरे उद्धरण चिह्नों का उपयोग करना चाहिए। JSON अजगर लाइब्रेरी इसे लागू करती है ताकि आप अपनी स्ट्रिंग लोड करने में असमर्थ हों। आपके डेटा को इस तरह देखना होगा:

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

यदि ऐसा कुछ नहीं है जो आप कर सकते हैं, तो आप ast.literal_eval()इसके बजाय उपयोग कर सकते हैंjson.loads()


3
यह पायथन लाइब्रेरी का प्रतिबंध नहीं है, बल्कि JSON प्रारूप का ही है।
डैनियल रोसमैन

तुम सही हो। हालाँकि, कुछ JSON पार्सर दोहरे उद्धरणों को लागू नहीं करते हैं। मैं अपना जवाब अपडेट करूंगा।
एलेक्सबक्ले

यह उपलब्ध नहीं है, JSON एकल-उद्धृत स्ट्रिंग्स के अंदर कभी भी कोई डबल उद्धरण नहीं है, आपको बस इतना करना है कि स्ट्रिंग करने से पहले सभी एकल को डबल-एकल में बदल देंjson.loads()
nigel222

2
यदि JSON स्ट्रिंग का बूलियन मान है ast.literal_eval, ValueError: malformed stringतो इसका उपयोग करने से परिणाम होगा ।
स्क्रैच'न'पार्ट

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)

हालाँकि यह सही समाधान है, लेकिन अगर इस तरह से JSON हो तो यह काफी सिरदर्द का कारण बन सकता है -

{'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

Json.dumps को जोड़ना JSON & हल समस्या को सही ढंग से स्वरूपित करना शुरू किया।


1

evalफ़ंक्शन का उपयोग करें ।

यह सिंगल और डबल कोट्स के बीच की विसंगति का ख्याल रखता है।


0

जैसा कि अन्य उत्तर अच्छी तरह से समझाते हैं कि त्रुटि त्रुटि के कारण होती है जो कि json मॉड्यूल को पारित किए गए अमान्य उद्धरण वर्णों के कारण होती है।

मेरे मामले में मैं जगह के बाद भी ValueError प्राप्त करने के लिए जारी रखा 'के साथ "मेरी स्ट्रिंग में। आखिरकार मुझे एहसास हुआ कि कुछ उद्धरण-जैसे यूनिकोड के प्रतीकों ने मेरी स्ट्रिंग में अपना रास्ता खोज लिया था:

           `  ´     

इन सभी को साफ करने के लिए आप एक नियमित अभिव्यक्ति के माध्यम से अपना स्ट्रिंग पास कर सकते हैं:

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("'", '"')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.