एकल उद्धरण के साथ JSON के रूप में पार्सिंग स्ट्रिंग?


84

मेरे पास एक तार है

str = "{'a':1}";
JSON.parse(str);
VM514:1 Uncaught SyntaxError: Unexpected token '(…)

मैं JSON ऑब्जेक्ट में उपरोक्त स्ट्रिंग (str) को पार्स कैसे कर सकता हूं?

यह एक साधारण पार्सिंग की तरह लगता है। हालांकि यह काम नहीं कर रहा है।


7
सिंगल कोट्स को सही ढंग से फॉर्मेट किया गया json नहीं है, इसलिए यदि आप ऐसा कुछ प्राप्त कर रहे हैं, तो शायद आपको str.replace () का उपयोग करना होगा और एकल qoutes को "पार्स करने की कोशिश करने से पहले" बदलना होगा
14

1
आपको वैसे भी हमेशा जावास्क्रिप्ट में तार के लिए एकल उद्धरण का उपयोग करने की कोशिश करनी चाहिए। var str = "bad example";अच्छा अभ्यास नहीं है, बेहतर निम्नलिखित करें: var str = 'good example';=> इस तरह से आपको JSON के साथ कोई समस्या नहीं होगी और आपको HTML के साथ कोई समस्या नहीं होगी। :)
ReeCube

3
@ReeCube एक राय से थोड़ा अधिक लगता है - वैसे भी HTML के साथ कोई समस्या नहीं है, यह दोनों को स्वीकार करता है। JSON के लिए, इसे स्ट्रिंग्स के साथ वैसे भी क्यों बनाएं? मुझे वास्तव में याद नहीं है कि पिछली बार मैंने JSON को किसी ऑब्जेक्ट के अलावा किसी अन्य चीज़ से बाहर कैसे बनाया था।
डेव न्यूटन

2
@DaveNewton मैं नियमित रूप से नोड, पायथन, php से json स्ट्रिंग्स बनाता हूं।
अल्फादोग6767

1
मुझे लगता है मुझे आपकी बात नहीं आती। लेकिन ठीक है।
अल्फादोग6767

जवाबों:


87

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

यदि आपके पास अपने तार में बिना बच गए एकल उद्धरणों के साथ एक सरल मामला है (जो सामान्य रूप से असंभव होगा, लेकिन यह JSON नहीं है), तो आप सरल हो सकते हैं str.replace(/'/g, '"')और आपको वैध JSON के साथ समाप्त होना चाहिए।


5
आपका जवाब डेटा के साथ छेड़छाड़ करेगा। एक अच्छा उत्तर संरचना को बदल देगा और डेटा संरचना के अंदर डेटा को नहीं।
टिमोथी गोंजालेज

3
@ssube, दोहरे के साथ एकल उद्धरणों को बदलने वाला वैश्विक पहला तरीका है जो दिमाग में आता है और यह एक स्लिपशॉट विधि है, क्योंकि यह शब्दकोश मूल्यों को नष्ट कर सकता है। जैसे 'title': "Mama's Friend"बन जाएगा "title": "Mama"s Friend", जो अमान्य है! मुझे आपके उत्तर को नीचा दिखाना चाहिए लेकिन मैं नीचता के खिलाफ हूं। यह टिप्पणी अधिक मूल्य की है।
एपोस्टोलोस

31

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन आप इस उद्देश्य के लिए JSON5 का उपयोग कर सकते हैं ।

<script src="json5.js"></script>
<script>JSON.stringify(JSON5.parse('{a:1}'))</script>

8
उपर्युक्त क्योंकि उपरोक्त समाधान कुछ इस तरह से विफल होंगे: {'section': "24'"} जो बन जाता है: {"section": "24""} और पार्स नहीं करेगा।
स्नोडकोव

1
यह शीर्ष उत्तर होना चाहिए।
सैम आर।

सही समाधान। HTML के स्क्रिप्ट टैग से एक JSON स्ट्रिंग को परिमार्जन करने की कोशिश कर रहा था, जिसमें लाइनब्रेक और खाली स्थान शामिल हैं। मेरा दिन बचाया!
DriLLFreAK100

मेरे लिए यह काम किया<script>JSON.stringify(some_jsonString)</script>
jAntoni

12

यदि आप सुनिश्चित हैं कि आपका JSON आपके नियंत्रण में है (उपयोगकर्ता इनपुट नहीं) तो आप केवल JSON का मूल्यांकन कर सकते हैं। Eval सभी बोली प्रकारों के साथ-साथ बिना किसी संपत्ति के नाम को भी स्वीकार करता है।

var str = "{'a':1}";
var myObject = (0, eval)('(' + str + ')');

अतिरिक्त पैरेंटस की आवश्यकता इस कारण से है कि इवैल पार्सर कैसे काम करता है। जब आप डेटा पर नियंत्रण रखते हैं तो इसका उपयोग बुराई नहीं है। JSON.parse और eval के बीच अंतर के बारे में अधिक जानने के लिए () JSON.parse बनाम eval () देखें


2
यहां तक ​​कि अगर आपको लगता है कि इस मामले में बुराई बुराई नहीं है, तो JSON.parse हमेशा तेज़ होता है: jsperf.com/json-parse-vs-eval/3
Arkanoid

@Arkanoid आपके द्वारा जुड़ा बेंचमार्क इस मामले पर लागू नहीं होता है क्योंकि यह केवल वैध JSON (JSON.stringify के कारण) का उपयोग करता है
syockit


7
var str =  "{'a':1}";
str = str.replace(/'/g, '"')
obj = JSON.parse(str);
console.log(obj);

इससे मेरे लिए समस्या हल हो गई।


1
यह डेटा को भी संशोधित करेगा। {'a':"A'A"}बन जाएगा{"a":"A"A"}
GodSaveTheDoge

6

JSON में कुंजियों के लिए एकल उद्धरण का उपयोग करने की अनुमति नहीं है। आपको दोहरे उद्धरण चिह्नों का उपयोग करने की आवश्यकता है।

आपके उपयोग-मामले के लिए शायद यह सबसे आसान समाधान होगा:

str = '{"a":1}';

स्रोत :

यदि किसी प्रॉपर्टी को उद्धरण चिह्नों की आवश्यकता होती है, तो दोहरे उद्धरण चिह्नों का उपयोग किया जाना चाहिए। सभी संपत्ति नामों को दोहरे उद्धरण चिह्नों से घिरा होना चाहिए।


-12
json = ( new Function("return " + jsonString) )(); 

कृपया अपने उत्तर स्पष्ट करें
स्टर्लिंग आर्चर

3
दोस्तों, कभी ऐसा मत करो। यह सुपर असुरक्षित है
जेम्पफोर्ड

Functionईवैल के बजाय उपयोग करने का प्रिंसिपल ध्वनि है, लेकिन बाकी सब गलत है। यह होना चाहिएvar json = Function("'use strict';return " + jsonString)()
जैक गिफिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.