जेएस में वस्तु के लिए स्ट्रिंग


190

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

string = "firstName:name1, lastName:last1"; 

अब मुझे इस तरह की एक वस्तु की आवश्यकता है

obj = {firstName:name1, lastName:last1}

जेएस में मैं यह कैसे कर सकता हूं?


1
नाम 1 और अंतिम 1 स्ट्रिंग मान या पहचानकर्ता हैं जिन्हें कहीं और परिभाषित किया गया है?
cdleary

1
अधिक डेटा की आवश्यकता है ... यदि कुंजी या मान में अल्पविराम या बृहदान्त्र हो तो आप क्या कर रहे हैं?
ब्रैड

यदि आपकी स्ट्रिंग JSON के रूप में प्रारूपित नहीं है, तो आपको RegEp को हैंडलर का उपयोग करना पड़ सकता है।
बिटफिशिक्‍स

जवाबों:


165

वास्तव में, सबसे अच्छा समाधान JSON का उपयोग कर रहा है:

प्रलेखन

JSON.parse(text[, reviver]);

उदाहरण:

1)

var myobj = JSON.parse('{ "hello":"world" }');
alert(myobj.hello); // 'world'

2)

var myobj = JSON.parse(JSON.stringify({
    hello: "world"
});
alert(myobj.hello); // 'world'

3) JSON को एक फंक्शन पास करना

var obj = {
    hello: "World",
    sayHello: (function() {
        console.log("I say Hello!");
    }).toString()
};
var myobj = JSON.parse(JSON.stringify(obj));
myobj.sayHello = new Function("return ("+myobj.sayHello+")")();
myobj.sayHello();

हालांकि कार्यों को पारित करने की अनुमति नहीं देगा
K2xL

2
यह सच है, हालांकि कड़ाई से बोलने वाले कार्य किसी भी JSON ऑब्जेक्ट्स में नहीं होने चाहिए .. इसके लिए आपके पास RPC आदि हैं, या यदि आप चाहते हैं, तो आप किसी फ़ंक्शन के प्रोटोटाइप को json में पास कर सकते हैं, और evalबाद में कर सकते हैं।
मतज

36
मुझे इस सवाल का जवाब नहीं देना चाहिए मुझे डर है। यह अद्भुत होगा यदि सभी ने उत्तर के अनुरूप प्रश्न को बदल दिया। आप "फर्स्टनाम: नाम 1, लास्टनाम: लास्ट 1" को कैसे पार्स करते हैं? "{" हैलो ":" दुनिया "} नहीं।
नोएल अब्राहम

33
यह सवाल का जवाब नहीं देता है, मुझे नहीं पता कि इसमें इतने सारे बदलाव क्यों हैं। प्रश्नकर्ता (और स्वयं, मैंने गुगली की और यहाँ समाप्त हो गया) में डेटा है जो JSON मानक के अनुरूप नहीं है इसलिए इसे पार्स नहीं किया जा सकता है।
हारून ग्रीनवैलड

1
var a = "firstName: name1, lastName: last1"; JSON.parse ('{' + + a '' ') एक त्रुटि फेंकता है।
आरोन ग्रीनवल्ड

73

आपकी स्ट्रिंग घुंघराले ब्रेसिज़ के बिना JSON स्ट्रिंग की तरह दिखती है।

यह तब काम करना चाहिए:

obj = eval('({' + str + '})');

22
यह एक संभावित सुरक्षा छेद है। मैं इस विधि को बिल्कुल भी स्वीकार नहीं करूंगा।
ब्रेटन

64
यह निर्भर करता है कि डेटा कहां से आता है। कुछ लोगों को सुरक्षा का जुनून है। यदि आप अपने डेटा को नियंत्रित करते हैं, तो आप समाधान खोजने में अधिक व्यावहारिक हो सकते हैं। या क्या आपके पास अपने रसोई और रहने वाले कमरे के बीच एक चोर-प्रूफ दरवाजा है?
फिलिप लेबेर्ट

13
वह काम नहीं कर रहा है। यह आपको त्रुटि देता है 'SyntaxError: अनपेक्षित टोकन:' । मैंने इसे क्रोम में चेक किया है।
न्यांबा

12
समाधान के चारों ओर कोष्ठक की आवश्यकता है:obj = eval('({' + str + '})');
क्रिश्चियन

12
prc322: हर कोई जानता है कि eval () बहुत सुरक्षित नहीं है (और यह एक ख़ामोश है), लेकिन eval () का उपयोग करना ऊपर दिए गए सवाल का एकमात्र सही उत्तर है क्योंकि इनपुट स्ट्रिंग एक वैध JSON स्ट्रिंग नहीं है और इनपुट स्ट्रिंग संदर्भ अन्य चर नाम से।
फिलिप लेबेर्ट

50

अगर मैं सही ढंग से समझ रहा हूँ:

var properties = string.split(', ');
var obj = {};
properties.forEach(function(property) {
    var tup = property.split(':');
    obj[tup[0]] = tup[1];
});

मैं मान रहा हूं कि संपत्ति का नाम बृहदान्त्र के बाईं ओर है और स्ट्रिंग मूल्य जो इसे लेता है वह दाईं ओर है।

ध्यान दें कि Array.forEachजावास्क्रिप्ट 1.6 है - आप अधिकतम संगतता के लिए टूलकिट का उपयोग करना चाह सकते हैं।


हे Cdleary ... मुझे आश्चर्य है कि अगर आप मेरी मदद कर सकते हैं: stackoverflow.com/questions/9357320/… क्षमा करें, आपको कोई अन्य तरीका नहीं मिल सकता है जिससे आप उर के जवाबों पर टिप्पणी के अलावा संपर्क कर सकते हैं
जेसन

1
प्रीफेक्ट पोस्ट। यह उत्तर जावास्क्रिप्ट की मूल बातें बहुत स्पष्ट रूप से उपयोग करता है और जिससे प्रत्येक ब्राउज़र में काम करना चाहिए
मिशेल

मैंने पाया कि यह दृष्टिकोण एक अच्छी शुरुआत थी, इसलिए उत्तर उपयोगी था। हालाँकि, xecute का एक मान्य बिंदु है कि यह उन स्ट्रिंग्स को समायोजित नहीं करता है जिनमें अल्पविराम हो सकता है। यदि आपके कोड को कॉमा के साथ तार को संभालने की आवश्यकता है, तो आप उद्धरणों के मिलान के रास्ते पर जा सकते हैं, लेकिन आप अभी भी उन मामलों को पकड़ नहीं पाएंगे, जहां उद्धरण बच गए हैं। बस आपको जो चाहिए, उसे लागू करें, फिर रुकें।
पैट्रिक ग्राहम

1
प्रश्नकर्ता द्वारा प्रस्तुत पार्सिंग पाठ के एक प्रश्न में, "क्या होगा" के प्रश्न बेकार हैं। हम दिए गए उदाहरण को डेटा के प्रतिनिधि के रूप में स्वीकार कर सकते हैं या हम बस इसका जवाब नहीं दे सकते क्योंकि हमेशा "क्या" हो सकता है जो पार्सिंग को तोड़ देगा।

1
पोस्टर में एक असामान्य संरचना को पार्स करने के तरीके के बारे में पूछा गया था जो कि JSON मान्य नहीं था। @ LCDleary ने परिस्थितियों के तहत सवाल का बहुत अच्छे से जवाब दिया। xecute: एक स्ट्रिंग में अल्पविराम से निपटने के लिए इस चर्चा के दायरे से परे एक उद्धृत या भागने तंत्र की आवश्यकता होगी।
सनकैट २२

37

यह सरल तरीका ...

var string = "{firstName:'name1', lastName:'last1'}";
eval('var obj='+string);
alert(obj.firstName);

उत्पादन

name1

इसके लिए अपग्रेड करें, ALTHOUGH: var string = "{firstName: 'name1', lastName: 'last1', f: function () {अलर्ट ('u hacked ...')} ()}"; eval ('var obj' + string) यह आपको हैक कर सकता है ... लेकिन मुझे लगता है कि इसकी कीमत है क्योंकि इसकी एकमात्र चीज कुछ मामलों में काम करती है।
कोड़ी

12

यदि आप JQuery का उपयोग कर रहे हैं:

var obj = jQuery.parseJSON('{"path":"/img/filename.jpg"}');
console.log(obj.path); // will print /img/filename.jpg

याद रखना: बुराई बुराई है! : डी


7
jQuery का उपयोग करता है evalglobalEval: /** code **/ window[ "eval" ].call( window, data ); /** more code **/
SomeShinyObject

12
स्ट्रिंग, प्रश्न स्वामी द्वारा प्रदान किया गया एक वैध JSON स्ट्रिंग नहीं है। तो, यह कोड बेकार है ...
xecute

हां, eval बुराई नहीं है यदि आप इसे "नियंत्रित" वातावरण पर उपयोग करते हैं (कुछ भी, लेकिन फ़ाइलों, नेटवर्क या उपयोगकर्ता इनपुट की तरह बाहरी डेटा, उस स्थिति में यह खतरनाक हो सकता है यदि "फ़िल्टर्ड / मान्य नहीं")।
मज़ारज़ार

11

चूंकि JSON.parse () विधि को सही ढंग से काम करने के लिए उद्धरण के भीतर ऑब्जेक्ट कुंजियों को संलग्न करने की आवश्यकता होती है, इसलिए हमें JSON.parse () विधि को कॉल करने से पहले स्ट्रिंग को एक JSON स्वरूपित स्ट्रिंग में बदलना होगा।

var obj = '{ firstName:"John", lastName:"Doe" }';

var jsonStr = obj.replace(/(\w+:)|(\w+ :)/g, function(matchedStr) {
  return '"' + matchedStr.substring(0, matchedStr.length - 1) + '":';
});

obj = JSON.parse(jsonStr); //converts to a regular object

console.log(obj.firstName); // expected output: John
console.log(obj.lastName); // expected output: Doe

यह तब भी काम करेगा जब स्ट्रिंग में एक जटिल ऑब्जेक्ट होगा (निम्न की तरह) और यह अभी भी सही ढंग से परिवर्तित होगा। बस यह सुनिश्चित करें कि स्ट्रिंग स्वयं एकल उद्धरणों में संलग्न है।

var strObj = '{ name:"John Doe", age:33, favorites:{ sports:["hoops", "baseball"], movies:["star wars", "taxi driver"]  }}';

var jsonStr = strObj.replace(/(\w+:)|(\w+ :)/g, function(s) {
  return '"' + s.substring(0, s.length-1) + '":';
});

var obj = JSON.parse(jsonStr);
console.log(obj.favorites.movies[0]); // expected output: star wars



8

यदि आपके पास एक स्ट्रिंग है जैसे foo: 1, bar: 2आप इसे एक मान्य obj में बदल सकते हैं:

str
  .split(',')
  .map(x => x.split(':').map(y => y.trim()))
  .reduce((a, x) => {
    a[x[0]] = x[1];
    return a;
  }, {});

इसके लिए #javascript में niggler का धन्यवाद।

स्पष्टीकरण के साथ अपडेट करें:

const obj = 'foo: 1, bar: 2'
  .split(',') // split into ['foo: 1', 'bar: 2']
  .map(keyVal => { // go over each keyVal value in that array
    return keyVal
      .split(':') // split into ['foo', '1'] and on the next loop ['bar', '2']
      .map(_ => _.trim()) // loop over each value in each array and make sure it doesn't have trailing whitespace, the _ is irrelavent because i'm too lazy to think of a good var name for this
  })
  .reduce((accumulator, currentValue) => { // reduce() takes a func and a beginning object, we're making a fresh object
    accumulator[currentValue[0]] = currentValue[1]
    // accumulator starts at the beginning obj, in our case {}, and "accumulates" values to it
    // since reduce() works like map() in the sense it iterates over an array, and it can be chained upon things like map(),
    // first time through it would say "okay accumulator, accumulate currentValue[0] (which is 'foo') = currentValue[1] (which is '1')
    // so first time reduce runs, it starts with empty object {} and assigns {foo: '1'} to it
    // second time through, it "accumulates" {bar: '2'} to it. so now we have {foo: '1', bar: '2'}
    return accumulator
  }, {}) // when there are no more things in the array to iterate over, it returns the accumulated stuff

console.log(obj)

भ्रामक MDN डॉक्स:

डेमो: http://jsbin.com/hiduhijevu/edit?js,console

समारोह:

const str2obj = str => {
  return str
    .split(',')
    .map(keyVal => {
      return keyVal
        .split(':')
        .map(_ => _.trim())
    })
    .reduce((accumulator, currentValue) => {
      accumulator[currentValue[0]] = currentValue[1]
      return accumulator
    }, {})
}

console.log(str2obj('foo: 1, bar: 2')) // see? works!

यह औसत पाठक के लिए एक पूरी तरह से समझ से बाहर है। क्या आप बता सकते हैं कि प्रत्येक रेखा क्या करती है? और ओपी के इनपुट को देखते हुए परिणामी आउटपुट क्या है?
not2qubit

काफी उचित। आमतौर पर मेरे पास सामान का विस्तार करने का समय नहीं होता है और मैं सिर्फ सहायक बिट्स को छोड़ रहा हूं (विशेष रूप से मामले में मैं सड़क के नीचे एक ही सटीक एसओ सवाल में दौड़ता हूं), लेकिन मुझे मिला।
१०

1
यह निश्चित रूप से सबसे सुरुचिपूर्ण समाधान है और वास्तव में बहुत सारे अन्य उत्तरों के विपरीत सवाल का जवाब देता है। और स्पष्टीकरण के लिए धन्यवाद!
कैथी हा

4

मैंने कोड की कुछ लाइनों में एक समाधान लागू किया जो काफी मज़बूती से काम करता है।

इस तरह एक HTML तत्व होना जहाँ मैं कस्टम विकल्प पास करना चाहता हूँ:

<div class="my-element"
    data-options="background-color: #dadada; custom-key: custom-value;">
</div>

एक फ़ंक्शन कस्टम विकल्पों को पार्स करता है और एक ऑब्जेक्ट को वापस करने के लिए उपयोग करता है:

function readCustomOptions($elem){
    var i, len, option, options, optionsObject = {};

    options = $elem.data('options');
    options = (options || '').replace(/\s/g,'').split(';');
    for (i = 0, len = options.length - 1; i < len; i++){
        option = options[i].split(':');
        optionsObject[option[0]] = option[1];
    }
    return optionsObject;
}

console.log(readCustomOptions($('.my-element')));

+1 data-कुछ छंदों / पुस्तकालयों की तरह छद्म-कस्टम विशेषताएँ बनाने के बजाय विशेषता का उपयोग करने के लिए ।
जॉन

3
string = "firstName:name1, lastName:last1";

यह काम करेगा:

var fields = string.split(', '),
    fieldObject = {};

if( typeof fields === 'object') ){
   fields.each(function(field) {
      var c = property.split(':');
      fieldObject[c[0]] = c[1];
   });
}

हालांकि यह कुशल नहीं है। जब आपके पास ऐसा कुछ होता है तो क्या होता है:

string = "firstName:name1, lastName:last1, profileUrl:http://localhost/site/profile/1";

split()'http' को विभाजित करेगा। इसलिए मेरा सुझाव है कि आप पाइप जैसे विशेष परिसीमन का उपयोग करें

 string = "firstName|name1, lastName|last1";


   var fields = string.split(', '),
        fieldObject = {};

    if( typeof fields === 'object') ){
       fields.each(function(field) {
          var c = property.split('|');
          fieldObject[c[0]] = c[1];
       });
    }

2
बस एक विचार - दूसरे विभाजन (':') के बजाय आप इंडेक्सऑफ (":") का उपयोग करके FIRST कॉलन द्वारा स्ट्रिंग को "मैन्युअल रूप से" विभाजित कर सकते हैं और स्ट्रिंग के हिस्से पर विचार करें जब तक कि यह बृहदान्त्र के रूप में कुंजी और शेष के रूप में बृहदान्त्र के बाद महत्व।
Ondrej Vencovsky

2

मैं JSON5 का उपयोग कर रहा हूं , और यह बहुत अच्छी तरह से काम करता है।

अच्छा हिस्सा यह है कि इसमें कोई eval और नहीं new Function , उपयोग करने के लिए बहुत सुरक्षित है।


1

यह सार्वभौमिक कोड है, कोई फर्क नहीं पड़ता कि आपका इनपुट लंबा है, लेकिन एक ही स्कीमा में अगर वहाँ है: विभाजक :)

var string = "firstName:name1, lastName:last1"; 
var pass = string.replace(',',':');
var arr = pass.split(':');
var empty = {};
arr.forEach(function(el,i){
  var b = i + 1, c = b/2, e = c.toString();
     if(e.indexOf('.') != -1 ) {
     empty[el] = arr[i+1];
  } 
}); 
  console.log(empty)

0

आपके मामले में

var KeyVal = string.split(", ");
var obj = {};
var i;
for (i in KeyVal) {
    KeyVal[i] = KeyVal[i].split(":");
    obj[eval(KeyVal[i][0])] = eval(KeyVal[i][1]);
}

3
eval को हर कीमत पर टाला जाना चाहिए।
एलेक्स

0
var stringExample = "firstName:name1, lastName:last1 | firstName:name2, lastName:last2";    

var initial_arr_objects = stringExample.split("|");
    var objects =[];
    initial_arr_objects.map((e) => {
          var string = e;
          var fields = string.split(','),fieldObject = {};
        if( typeof fields === 'object') {
           fields.forEach(function(field) {
              var c = field.split(':');
              fieldObject[c[0]] = c[1]; //use parseInt if integer wanted
           });
        }
            console.log(fieldObject)
            objects.push(fieldObject);
        });

"ऑब्जेक्ट" सरणी में सभी ऑब्जेक्ट होंगे


0

मुझे पता है कि यह एक पुरानी पोस्ट है लेकिन सवाल का सही जवाब नहीं देखा।

var jsonStrig = '{';
      var items = string.split(',');
      for (var i = 0; i < items.length; i++) {
          var current = items[i].split(':');
          jsonStrig += '"' + current[0] + '":"' + current[1] + '",';
      }
      jsonStrig = jsonStrig.substr(0, jsonStrig.length - 1);
      jsonStrig += '}';
var obj = JSON.parse(jsonStrig);
console.log(obj.firstName, obj.lastName);

अब आप उपयोग कर सकते हैं obj.firstNameऔर obj.lastNameमान प्राप्त कर सकते हैं जैसा कि आप सामान्य रूप से किसी वस्तु के साथ कर सकते हैं।

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