ऑब्जेक्ट स्ट्रिंग को JSON में कनवर्ट करें


165

मैं एक स्ट्रिंग को कैसे परिवर्तित कर सकता हूं जो जावास्क्रिप्ट (या jQuery) का उपयोग करके एक JSON स्ट्रिंग में एक वस्तु का वर्णन करता है?

उदाहरण के लिए: कन्वर्ट यह ( नहीं एक मान्य JSON स्ट्रिंग):

var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }"

इस मामले में:

str = '{ "hello": "world", "places": ["Africa", "America", "Asia", "Australia"] }'

मैं eval()अगर संभव हो तो उपयोग करने से बचना पसंद करूंगा ।


आपकी स्ट्रिंग JSON को पहले स्थान पर मान्य क्यों नहीं है? आप कैसे पैदा कर रहे हैं?
रॉकेट हज़मत

2
स्ट्रिंग को dataइस तरह से -attrubute में संग्रहित किया जाता है : <div data-object="{hello:'world'}"></div>और मैं HTML में एकल उद्धरणों का उपयोग नहीं करना चाहता हूं (इसलिए शायद इस पर भरोसा नहीं किया जाए)
snorpey

5
@snorpey: <div data-object='{"hello":"world"}'></div>100% वैध HTML है (सिंगल कोट्स को इस पर भरोसा करने या न करने से क्या लेना देना है?)। यदि आप इसे इस तरह करते हैं, तो आप JSON.parseइसे कर सकते हैं और यह ठीक काम करेगा। नोट: कुंजियों को भी उद्धृत किया जाना चाहिए।
रॉकेट हज़मत

@ अपने प्रयासों के लिए धन्यवाद! मैं सिर्फ HTML में सिंगल कोट्स (भले ही यह 100% वैध हो) और JSON नोटेशन का उपयोग करने के लिए एक रास्ता खोजना चाहता था।
स्नोर्पाय

@snorpey: वे इस तरह से JSON को HTML विशेषता में पहली जगह पर नहीं डालते हैं। मुझे लगता है कि आप दोहरे उद्धरण चिह्नों का उपयोग कर सकते हैं, और JSON में लोगों से बच सकते हैं <div data-object="{\"hello\":\"world\"}"></div>। यदि आप विशेषता में JSON का उपयोग नहीं करना चाहते हैं, तो आपको अपना प्रारूप बनाना होगा और इसे स्वयं पार्स करना होगा।
रॉकेट हज़मत

जवाबों:


181

स्ट्रिंग एक विश्वसनीय स्रोत से है , तो आप इस्तेमाल कर सकते हैं evalतो JSON.stringifyपरिणाम। ऐशे ही:

var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
var json = JSON.stringify(eval("(" + str + ")"));

ध्यान दें कि जब आप evalएक ऑब्जेक्ट शाब्दिक होते हैं, तो इसे कोष्ठक में लपेटना पड़ता है, अन्यथा ब्रेसिज़ को ऑब्जेक्ट के बजाय ब्लॉक के रूप में पार्स किया जाता है।

मैं इस प्रश्न के तहत टिप्पणियों से भी सहमत हूं कि केवल वैध JSON में ऑब्जेक्ट को एनकोड करना बेहतर होगा, ताकि पार्स, एन्कोड करने से बचें, फिर संभवतः इसे फिर से पार्स करें । HTML एकल-उद्धृत विशेषताओं का समर्थन करता है (बस स्ट्रिंग के अंदर किसी एकल उद्धरण को HTML-सांकेतिक शब्दों में बदलना सुनिश्चित करें)।


इसका कोई मतलब नहीं है, अगर स्ट्रिंग विश्वसनीय स्रोत से है, तो हम इसे क्यों कनवर्ट करते हैं बजाय हम इसे वैध जसन के रूप में बनाते हैं।
एलनह्विक

2
@allenhwkim यह विचार अमान्य JSON से मान्य JSON में परिवर्तित करने के लिए है, इसलिए evalस्ट्रिंग को JavaScript ऑब्जेक्ट में परिवर्तित करता है (जो काम करता है, जब तक स्ट्रिंग मान्य JavaScript का प्रतिनिधित्व करता है, भले ही वह JSON मान्य न हो)। फिर JSON.stringifyएक ऑब्जेक्ट से एक (वैध) JSON स्ट्रिंग में कनवर्ट करता है। कॉलिंग evalखतरनाक है अगर स्ट्रिंग एक विश्वसनीय स्रोत से नहीं है क्योंकि यह सचमुच किसी भी जावास्क्रिप्ट को चला सकता है जो क्रॉस-साइट स्क्रिप्टिंग हमलों की संभावना को खोलता है।
मैथ्यू क्रुमले

2
eval इस मामले में अभी भी खराब काम करेगा यदि स्ट्रिंग का निर्माण किया जाता है, उदाहरण के लिए, इस तरह: var str = "(function () {कंसोल.लॉग (\" bad \ ")}) ()";
रोंडो

Eval () का उपयोग JS कोड निष्पादित करेगा। इसका आसानी से दुरुपयोग किया जा सकता है।
FisNaN

@allenhwkim: हमें कभी किसी स्रोत पर भरोसा नहीं है। IT में ट्रस्ट का अर्थ है चेक, चेक और फिर से जांच।
लास्ज़्लो वर्गा

110

आपका स्ट्रिंग JSON मान्य नहीं है, इसलिए JSON.parse(या jQuery का $.parseJSON) काम नहीं करेगा।

एक तरीका eval"अमान्य" JSON को "पार्स" करने के लिए उपयोग करना होगा , और फिर stringifyइसे JSON को मान्य करने के लिए "कन्वर्ट" करना होगा।

var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }"
str = JSON.stringify(eval('('+str+')'));

मैं सुझाव देता हूं कि आप अपने अमान्य JSON को "ठीक" करने की कोशिश कर रहे हैं, आप पहली बार वैध JSON से शुरू करते हैं। कैसे strउत्पन्न किया जा रहा है, इसे वहाँ से पहले तय किया जाना चाहिए, इसके बाद नहीं।

संपादित करें : आपने कहा (टिप्पणियों में) यह स्ट्रिंग डेटा विशेषता में संग्रहीत है:

<div data-object="{hello:'world'}"></div>

मेरा सुझाव है कि आप इसे यहां ठीक कर सकते हैं, इसलिए यह सिर्फ JSON.parseडी हो सकता है । सबसे पहले, वे दोनों कुंजी और मूल्यों को दोहरे उद्धरण चिह्नों में उद्धृत करने की आवश्यकता है। यह दिखना चाहिए (HTML में एकल उद्धृत विशेषताएँ मान्य हैं):

<div data-object='{"hello":"world"}'></div>

अब, आप बस JSON.parse(या jQuery के $.parseJSON) का उपयोग कर सकते हैं ।

var str = '{"hello":"world"}';
var obj = JSON.parse(str);

49

jQuery.parseJSON

str = jQuery.parseJSON(str)

संपादित करें। यह प्रदान किया जाता है आपके पास एक वैध JSON स्ट्रिंग है


1
यह सच है कि मैंने सवाल देखा कि JSON स्ट्रिंग को ऑब्जेक्ट में कैसे परिवर्तित किया जाए
फार्मर

43

नीचे दिए गए लिंक में सरल कोड का उपयोग करें:

http://msdn.microsoft.com/es-es/library/ie/cc836466%28v=vs.94%29.aspx

var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}';
var contact = JSON.parse(jsontext);

और रिवर्स

var str = JSON.stringify(arr);

नए स्ट्रिंग (jsontext) के माध्यम से एक स्ट्रिंग ऑब्जेक्ट के लिए jsontext परिवर्तित करना संभवत: प्रकार की सुरक्षा के लिए बेहतर है।
फजी विश्लेषण

@ फज़्नयालिसिस: नहीं, आदिम आवरणों का उपयोग कभी नहीं किया जाना चाहिए।
Ry-

1
JSON.parse () @LouiseMcMahon
पिक्सेल 67

24

मुझे उम्मीद है कि यह छोटा फ़ंक्शन अमान्य JSON स्ट्रिंग को मान्य करने के लिए कनवर्ट करता है।

function JSONize(str) {
  return str
    // wrap keys without quote with valid double quote
    .replace(/([\$\w]+)\s*:/g, function(_, $1){return '"'+$1+'":'})    
    // replacing single quote wrapped ones to double quote 
    .replace(/'([^']+)'/g, function(_, $1){return '"'+$1+'"'})         
}

परिणाम

var invalidJSON = "{ hello: 'world',foo:1,  bar  : '2', foo1: 1, _bar : 2, $2: 3, 'xxx': 5, \"fuz\": 4, places: ['Africa', 'America', 'Asia', 'Australia'] }"
JSON.parse(invalidJSON) 
//Result: Uncaught SyntaxError: Unexpected token h VM1058:2
JSON.parse(JSONize(invalidJSON)) 
//Result: Object {hello: "world", foo: 1, bar: "2", foo1: 1, _bar: 2…}

हम अपने कोड JSON.parse का उपयोग करके b-evalify करने की कोशिश कर रहे हैं और यह एक अच्छा समाधान की तरह लग रहा है। हम अभी भी हाथ से लगातार प्रतिस्थापन को संभालने जा रहे हैं, लेकिन कम से कम यह उन मामलों को शामिल करने की अनुमति देता है।
रवेमीर

1
यह लगभग सही है। किसी : एक मूल्य में होने पर काम नहीं करता है।
सेलेर

9

सावधानी बरतें (क्योंकि eval())

function strToJson(str) {
  eval("var x = " + str + ";");
  return JSON.stringify(x);
}

इस रूप में कॉल करें:

var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
alert( strToJson(str) );

3
अनाम डाउन-वोटर को। मैं आपको बेहतर समाधान प्रदान करने के लिए चुनौती देता हूं। इसके अलावा डाउन-वोट का एक कारण अच्छा होगा।
तोमलक

1
@ कार्ड: आप गलत हैं। a) eval()इसे करने का एकमात्र तरीका है। b) मैंने ओपी को इसके बारे में आगाह किया था। c) मैथ्यू क्रुमले के उत्तर को देखें और बेहतर स्पष्टीकरण के बारे में सोचें। (ओह, और डी) बयान eval()बुरा है इस सामान्यीकृत रूप में बकवास है।)
टॉमालक

2
@ लॉकेट: आह, गलतफहमी वहीं है। क्षमा करें, मुझे लगा कि डाउन-वोट आपका था। :)
टॉमालक

1
@kuboslav: यह ठीक काम करता है, क्या आपने भी इसका परीक्षण किया था? वह कर रहा है eval("var x = " + str + ";")जो पूरी तरह से वैध जेएस है। आपको करने की आवश्यकता नहीं है var x = ({a:12})
रॉकेट हज़मत

2
@kuboslav यह IE7 में काम नहीं करता है क्योंकि IE7 में देशी JSON का समर्थन नहीं है। जैसे ही आप इसका इस्तेमाल करना शुरू करेंगे json2.js। इतने ट्रिगर-खुश मत बनो।
तोमलक

4

डिस्क्लेमर: इसे घर पर या ऐसी किसी भी चीज़ के लिए न आज़माएँ, जिसके लिए अन्य देवों को गंभीरता से लेने की आवश्यकता हो:

JSON.stringify(eval('(' + str + ')'));

वहां, मैंने इसे किया।
इसे करने की कोशिश न करें, eval आपके लिए BAD है। जैसा कि ऊपर बताया गया है, पुराने ब्राउज़र (IE7 और उससे कम) के लिए क्रॉकफोर्ड के JSON शिम का उपयोग करें

इस पद्धति के लिए आपके स्ट्रिंग को मान्य जावास्क्रिप्ट होना आवश्यक है , जिसे एक जावास्क्रिप्ट ऑब्जेक्ट में परिवर्तित किया जाएगा जिसे तब JSON में अनुक्रमित किया जा सकता है।

संपादित करें: जैसा कि रॉकेट ने सुझाव दिया है।


यह होना चाहिए JSON.stringify(eval('('+str+')'));, ऐसा नहीं है कि मैं निंदा करता हूं eval, लेकिन उसका तार वैध JSON नहीं है इसलिए JSON.parseकाम नहीं करता है।
रॉकेट हज़मत

4

मैंने अपना जवाब किसी ऐसे व्यक्ति के लिए रखा है जो इस पुराने सूत्र में रुचि रखता है।

मैंने jQuery प्लगइन और डेमो के लिए एचटीएमएल 5 डेटा- * पार्सर बनाया जो बिना उपयोग किए एक विकृत JSON स्ट्रिंग को जावास्क्रिप्ट ऑब्जेक्ट में बदल देता है ।eval()

यह HTML5 डेटा पारित कर सकता है- * विशेषताएँ bellow:

<div data-object='{"hello":"world"}'></div>
<div data-object="{hello:'world'}"></div>
<div data-object="hello:world"></div>

वस्तु में:

{
    hello: "world"
}

2

डगलस क्रॉकफोर्ड का एक कनवर्टर है, लेकिन मुझे यकीन नहीं है कि यह खराब JSON से अच्छे JSON को मदद करेगा।

https://github.com/douglascrockford/JSON-js


यह वास्तव में मदद नहीं करता है, क्योंकि स्ट्रिंग वैध JSON नहीं है।
रॉकेट हज़मत

2

इस उपलब्धि को पूरा करने का एक बहुत ही सरल तरीका है, एक जावास्क्रिप्ट ऑब्जेक्ट के रूप में अपने स्ट्रिंग की वापसी को मजबूर करने के लिए एक डमी तत्व की ऑनक्लिक विशेषता का अपहरण करें:

var jsonify = (function(div){
  return function(json){
    div.setAttribute('onclick', 'this.__json__ = ' + json);
    div.click();
    return div.__json__;
  }
})(document.createElement('div'));

// Let's say you had a string like '{ one: 1 }' (malformed, a key without quotes)
// jsonify('{ one: 1 }') will output a good ol' JS object ;)

यहाँ एक डेमो है: http://codepen.io/csuwldcat/pen/dfzsu (अपना कंसोल खोलें)


2

आपको परिणाम के लिए JSON.stringify के बाद "eval" का उपयोग करने की आवश्यकता है।

 var errorString= "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
 var jsonValidString = JSON.stringify(eval("(" + errorString+ ")"));
 var JSONObj=JSON.parse(jsonValidString);

यहां छवि विवरण दर्ज करें


1

आपको गोल कोष्ठक लिखना evalहोगा , क्योंकि उनके बिना आदेशों के ब्लॉक के रूप में घुंघराले कोष्ठक के अंदर कोड पर विचार किया जाएगा।

var i = eval("({ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] })");

1

आपका सबसे अच्छा और सबसे सुरक्षित दांव JSON5 - इंसान के लिए JSON होगा । यह विशेष रूप से उस उपयोग के मामले के लिए बनाया गया है।

const result = JSON5.parse("{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }");

console.log(JSON.stringify(result));
<script src="https://cdnjs.cloudflare.com/ajax/libs/json5/0.5.1/json5.min.js"></script>


1

नए फ़ंक्शन का उपयोग करना () eval से बेहतर है, लेकिन फिर भी इसका उपयोग केवल सुरक्षित इनपुट के साथ किया जाना चाहिए।

const parseJSON = obj => Function('"use strict";return (' + obj + ')')();

console.log(parseJSON("{a:(4-1), b:function(){}, c:new Date()}"))
// outputs: Object { a: 3, b: b(), c: Date 2019-06-05T09:55:11.777Z }

सूत्रों का कहना है: MDN , 2ality


0

ऊपर दिए गए अपने सरल उदाहरण के लिए, आप 2 सरल regex के स्थान का उपयोग करके ऐसा कर सकते हैं:

var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
str.replace(/(\w+):/g, '"$1":').replace(/'/g, '"');
 => '{ "hello": "world", "places": ["Africa", "America", "Asia", "Australia"] }'

बिग कैविएट : यह भोली दृष्टिकोण मानता है कि ऑब्जेक्ट में तार 'या :चरित्र नहीं है। उदाहरण के लिए, मैं JSON का उपयोग किए बिना निम्न ऑब्जेक्ट-स्ट्रिंग को परिवर्तित करने का एक अच्छा तरीका नहीं सोच सकता eval:

"{ hello: 'world', places: [\"America: The Progressive's Nightmare\"] }"

0

बस इसके quirks के लिए, आप के माध्यम से अपने स्ट्रिंग परिवर्तित कर सकते हैं babel-standalone

var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";

function toJSON() {
  return {
    visitor: {
      Identifier(path) {
        path.node.name = '"' + path.node.name + '"'
      },
      StringLiteral(path) {
        delete path.node.extra
      }
    }
  }
}
Babel.registerPlugin('toJSON', toJSON);
var parsed = Babel.transform('(' + str + ')', {
  plugins: ['toJSON']
});
var json = parsed.code.slice(1, -2)
console.log(JSON.parse(json))
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>


0

var str = "{hello: 'world', Places: ['Africa', 'America', 'Asia', 'Australia']}" var fStr = str .replace (/ ([Az] *) (:) / जी, '"$ 1":') .replace (/ / / g, "\" ")

console.log (JSON.parse (fStr))यहां छवि विवरण दर्ज करें

क्षमा करें मैं अपने फोन पर हूं, यहां एक तस्वीर है।


0

एक regex के साथ एक समाधान और eval का उपयोग नहीं:

str.replace(/([\s\S]*?)(')(.+?)(')([\s\S]*?)/g, "$1\"$3\"$5")

मेरा मानना ​​है कि सिंगल-कोट 'स्ट्रिंग' की जगह कई लाइनों और सभी संभावित घटनाओं (/ g फ्लैग) के लिए काम करना चाहिए, जिसे "डबल-कोट" से बदल दिया जाएगा।



-1

शायद आपको यह प्रयास करना होगा:

str = jQuery.parseJSON(str)

प्रश्न निर्दिष्ट "या jQuery" और यह सही समाधान है यदि आपके पास यह उपलब्ध है।
इकोलोपोलिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.