JSON

2010-11-12 13 views
62
में एकल बनाम डबल कोट्स

मेरे कोड:JSON

import simplejson as json 

s = "{'username':'dfdsfdsf'}" #1 
#s = '{"username":"dfdsfdsf"}' #2 
j = json.loads(s) 

#1 परिभाषा गलत

#2 परिभाषा है सही है

मैं अजगर में सुना था कि है कि एक दोहरे उद्धरण विनिमेय हो सकता है, कर सकते हैं कोई भी मेरे लिए यह समझाता है?

उत्तर

105

JSON syntax पायथन वाक्यविन्यास नहीं है। जेएसओएन को अपने तारों के लिए डबल कोट्स की आवश्यकता है।

+2

लेकिन पहला यह JSON में एकल उद्धरण है, मैं उलझन में हूं। वह संकलन पास कर सकता है लेकिन दूसरा नहीं कर सकता है। –

+3

# 1 यहां लोड करने में विफल रहता है। –

+0

ओह हाँ, क्षमा करें, धन्यवाद। –

23

आप द्वारा दोहरे उद्धरण के साथ JSON डंप कर सकते हैं:

from json import dumps 

#mixing single and double quotes 
data = {'jsonKey': 'jsonValue',"title": "hello world"} 

jsonString = json.dumps(data) 
#get string with all double quotes 
+4

यह गलत तरीका है। आप JSON को पायथन डेटा संरचनाओं को क्रमबद्ध कर रहे हैं; मूल प्रश्न जेएसओएन को डेटा संरचनाओं को पाइथन करने के बारे में है। – tedder42

+2

विचार json.dumps के साथ जेसन में पायथन को क्रमबद्ध करना होगा, फिर जब यह स्ट्र फॉर्म में है तो json.loads को कॉल करें। – jheld

+2

आपको यहां समझने की याद आती है। यदि आप जेसन स्ट्रिंग लोड करना चाहते हैं, तो इसे डबल कोट होना चाहिए। आप जो कर रहे हैं वह अभी भी जेसन डंप नहीं है, जेसन स्ट्रिंग नहीं। – LegitMe

61

आप उपयोग कर सकते ast.literal_eval()

>>> import ast 
>>> s = "{'username':'dfdsfdsf'}" 
>>> ast.literal_eval(s) 
{'username': 'dfdsfdsf'} 
+2

यह बहुत मददगार था। बहुत बहुत धन्यवाद। :) –

+1

मुझे यह जवाब सबसे अच्छा लगता है: आपके पास अक्सर कोई विकल्प नहीं होता है: यदि कोई आपको एकल उद्धरण देता है, तो आपको सिंगल कोट्स मिलते हैं। या तो json.loads को एक अतिरिक्त तर्क की आवश्यकता है, या आपको इसका उपयोग करना चाहिए। वैश्विक रूप से "'" को बदलना एक आपदा है, जैसा कि आने वाला डेटा है: '{' a ':' यह" स्ट्रिंग "वास्तव में नहीं है !!!! } ' –

5

demjson भी बुरा json वाक्य रचना की समस्या को हल करने के लिए एक अच्छा पैकेज है:

pip install demjson 

उपयोग:

from demjson import decode 
bad_json = "{'username':'dfdsfdsf'}" 
python_dict = decode(bad_json) 

संपादित करें:

demjson.decode क्षतिग्रस्त json के लिए एक महान उपकरण है, लेकिन ast.literal_eval जब आप json डेटा की बड़ी amourt साथ काम कर रहे एक बेहतर मैच है और बहुत तेजी से।

+3

' demjson.decode' क्षतिग्रस्त जेसन के लिए एक शानदार उपकरण है - लेकिन दसियों या हजारों जेसन पैकेट से जुड़े कार्यों के लिए, 'ast.literal_eval' बहुत तेज़ है। यह नहीं कहना है कि 'डेमजसन' में इसकी जगह नहीं है: यदि तेजी से विधियां विफल हो जाती हैं तो मैं इसे फ़ॉलबैक के रूप में उपयोग करता हूं। – mjwunderlich

+1

आपको बहुत बहुत धन्यवाद, मुझे इसके बारे में पता नहीं था। – DhiaTN

-1
import json 
data = json.dumps(list) 
print(data) 

ऊपर कोड स्निपेट काम करना चाहिए।

+1

यह कुछ उपयोगी कर सकता है, लेकिन यह पूछे जाने वाले प्रश्न का उत्तर नहीं देता है। समस्या एक स्ट्रिंग के साथ शुरू होती है, सूची नहीं। – Rachel

0

जैसा कि कहा गया है, जेएसओएन पायथन वाक्यविन्यास नहीं है। आपको JSON में डबल कोट्स का उपयोग करने की आवश्यकता है। इसके निर्माता (इन-) प्रोग्रामर संज्ञानात्मक अधिभार को कम करने के लिए स्वीकार्य वाक्यविन्यास के सख्त सबसेट का उपयोग करने के लिए प्रसिद्ध हैं।

यह वास्तव में उपयोगी है यह जानने के लिए कि JSON स्ट्रिंग में कोई एकल उद्धरण नहीं है। कहें, आपने ब्राउज़र कंसोल/जो कुछ भी इसे कॉपी और पेस्ट किया है। फिर, आप केवल

a = json.loads('very_long_json_string_pasted_here') 

यह अन्यथा तोड़ सकता है अगर यह सिंगल कोट्स का भी उपयोग करता है।