জেএসে স্ট্রিং অবজেক্ট


190

আমার মতো স্ট্রিং আছে

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

এখন আমার এমন একটি বস্তুর আপত্তি দরকার

obj = {firstName:name1, lastName:last1}

আমি কীভাবে জেএসে এটি করতে পারি?


1
নাম 1 এবং সর্বশেষ 1 স্ট্রিং মান বা সনাক্তকারী যা অন্য কোথাও সংজ্ঞায়িত হয়েছে?
সিডলারি

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) জেএসএনে একটি ফাংশন পাস করা

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();

যদিও ফাংশনগুলি পাস হতে দেবে না
কে

2
এটি সত্য, তবে কঠোরভাবে বলা ফাংশনগুলি কোনও JSON অবজেক্টে থাকা উচিত নয় that এর জন্য আপনার কাছে আরপিসি ইত্যাদি রয়েছে, বা আপনি যদি চান, আপনি কোনও ফাংশনটির প্রোটোটাইপটি জসনকে দিতে পারেন, এবং evalপরে এটি করতে পারেন।
মতেজ 4'14

36
আমি ভয় পেয়েছি এমন প্রশ্নের উত্তর একেবারেই দেয় না। প্রত্যেকে প্রশ্নের উত্তর অনুসারে প্রশ্নটি পরিবর্তন করলে আশ্চর্য হবে। আপনি কীভাবে "প্রথম নাম: নাম 1, লাস্টনাম: লাস্ট 1" পার্স করবেন? 'hello "হ্যালো" নয়: "বিশ্ব"।'।
নোল আব্রাহামস

33
এটি প্রশ্নের উত্তর দেয় না, কেন জানি এটির এতগুলি উত্সাহ রয়েছে। প্রশ্নকর্তা (এবং আমি নিজেই গুগল করেছি এবং এখানেই শেষ হয়েছি) এমন ডেটা রয়েছে যা JSON স্ট্যান্ডার্ডের সাথে খাপ খায় না তাই পার্স করা যায় না।
অ্যারন গ্রিনওয়াল্ড

1
var a = "প্রথম নাম: নাম 1, শেষ নাম: সর্বশেষ 1"; JSON.parse ('{' + a + '}') ত্রুটি ছুড়ে ফেলে।
অ্যারন গ্রিনওয়াল্ড 15'15

73

আপনার স্ট্রিংটি কোঁকড়া ধনুর্বন্ধনী ছাড়াই JSON স্ট্রিংয়ের মতো দেখাচ্ছে।

এটি তখন কাজ করা উচিত:

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

22
এটি একটি সম্ভাব্য সুরক্ষা গর্ত। আমি এই পদ্ধতিটি মোটেও গ্রহণ করব না।
ব্রেটন

64
এটি কোথা থেকে ডেটা আসে তা নির্ভর করে। কিছু লোক সুরক্ষায় নিবিষ্ট। আপনি যদি নিজের ডেটা নিয়ন্ত্রণ করেন তবে সমাধান সন্ধানে আপনি আরও ব্যবহারিক হতে পারেন। বা আপনার রান্নাঘর এবং বসার ঘরের মধ্যে একটি চোর-প্রমাণ দরজা আছে?
ফিলিপ লেবাবার্ট

13
কাজ হচ্ছে না। এটি আপনাকে ত্রুটি দেয় 'সিনট্যাক্সেরর: অপ্রত্যাশিত টোকেন:' । আমি এটি ক্রোমে পরীক্ষা করেছি।
নাইম্বা

12
: সমাধান এটি প্রায় প্রথম বন্ধনী প্রয়োজনobj = eval('({' + str + '})');
খৃস্টান

12
prc322: প্রত্যেকেই জানেন যে eval () খুব সুরক্ষিত নয় (এবং এটি একটি স্বল্প বিস্তৃত বিষয়) তবে ওপাল () ব্যবহার করা উপরের প্রশ্নের একমাত্র সঠিক উত্তর কারণ ইনপুট স্ট্রিংটি কোনও বৈধ JSON স্ট্রিং নয় এবং ইনপুট স্ট্রিংটি অন্যান্য ভেরিয়েবলগুলি উল্লেখ করে because নামে.
ফিলিপ লেবার্ট

50

যদি আমি সঠিকভাবে বুঝতে পারি:

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

আমি ধরে নিচ্ছি যে সম্পত্তির নামটি কোলনের বাম দিকে এবং স্ট্রিংয়ের মানটি এটি গ্রহণ করে ডানদিকে।

নোটটি Array.forEachজাভাস্ক্রিপ্ট ১.6 - আপনি সর্বাধিক সামঞ্জস্যের জন্য একটি টুলকিট ব্যবহার করতে চাইতে পারেন।


আরে সিডলারি ... আমি অবাক হয়েছি আপনি যদি আমাকে সাহায্য করতে পারেন: stackoverflow.com/questions/9357320/… দুঃখিত আপনার উত্তর সম্পর্কে মন্তব্য ছাড়া আপনার সাথে যোগাযোগের আর উপায় খুঁজে বের করতে পারেনি
জেসন

1
প্রিফেক্ট পোস্ট এই উত্তরটি জাভাস্ক্রিপ্টের বেসিকগুলি খুব স্পষ্টভাবে ব্যবহার করে এবং এর ফলে প্রতিটি ব্রাউজারে কাজ করা উচিত
মিশেল

আমি এই পদ্ধতির একটি ভাল শুরু ছিল, তাই উত্তর দরকারী ছিল। তবে, xecute এর একটি বৈধ পয়েন্ট রয়েছে যে এটি কমা থাকতে পারে এমন স্ট্রিংগুলিকে সামঞ্জস্য করে না। আপনার কোডটি যদি কমা দিয়ে স্ট্রিংগুলি পরিচালনা করতে হয় তবে আপনি মেলা উদ্ধৃতিগুলির পথে যেতে পারেন, তবে আপনি এখনও উদ্ধৃতিগুলি রক্ষা পাওয়ার ক্ষেত্রে এমন ঘটনাগুলি ধরতে পারবেন না। আপনার যা প্রয়োজন তা বাস্তবায়ন করুন, তারপরে থামুন।
প্যাট্রিক গ্রাহাম

1
প্রশ্নকারী দ্বারা উপস্থাপিত পাঠ্য বিশ্লেষণের প্রশ্নে, "যদি তবে" কী হয় তা প্রশ্নহীন। আমরা প্রদত্ত উদাহরণটিকে উপাত্তের প্রতিনিধি হিসাবে গ্রহণ করতে পারি বা আমরা উত্তর দিতে পারি না যেহেতু সর্বদা একটি "কী যদি" হতে পারে যা পার্সিং ভেঙে দেয়।

1
পোস্টারটি এমন কোনও অস্বাভাবিক কাঠামোকে কীভাবে পার্স করতে পারে যা বৈধ JSON নয় J @ সিডলারি পরিস্থিতিতে খুব ভাল উত্তর দিয়েছিল। xecute: একটি স্ট্রিতে কমা হ্যান্ডল করার জন্য এই আলোচনার পরিধি ছাড়িয়ে একটি উদ্ধৃতি বা পলায়নের প্রক্রিয়া প্রয়োজন।
সানকাট 2000

37

এই সহজ উপায় ...

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

আউটপুট

name1

এর জন্য উত্সাহ দিন, ALTHOUGH: var string = "= firstName: 'name1', lastName: 'last1', f: ফাংশন () {সতর্কতা ('আপনি হ্যাক পেয়েছেন ...')} ()}"; eval ('var obj' + স্ট্রিং) এটি আপনাকে হ্যাক করতে পারে ... তবে আমি এটির মূল্য মনে করি কারণ এটি কেবলমাত্র কিছু ক্ষেত্রে কাজ করে।
কোডি

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 **/
সোমারশাইনঅবজেক্ট

12
প্রশ্নের মালিক দ্বারা সরবরাহ করা স্ট্রিংটি কোনও বৈধ JSON স্ট্রিং নয়। সুতরাং, এই কোডটি অকেজো ...
xecute

হ্যাঁ, এভাল কোনও খারাপ কাজ নয় যদি আপনি এটি "নিয়ন্ত্রিত" পরিবেশে ব্যবহার করেন (ফাইল, নেটওয়ার্ক বা ব্যবহারকারী ইনপুটের মতো বাহ্যিক ডেটা ছাড়া অন্য কোনও কিছুই, সেই ক্ষেত্রে এটি "ফিল্টার / বৈধ" না হয়ে বিপজ্জনক হতে পারে)।
mzalazar


10

যেহেতু 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এটির সাথে বৈধ আপদে রূপান্তর করতে পারেন:

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

তার জন্য # জাভাস্ক্রিপ্টে নিগলারকে ধন্যবাদ।

ব্যাখ্যা সহ আপডেট করুন:

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!

এটি গড় পাঠকের পক্ষে সম্পূর্ণ বোঝা যায় না answer আপনি প্রতিটি লাইন কি করতে পারে ব্যাখ্যা করতে পারেন? এবং ফলস্বরূপ আউটপুট কি দেওয়া হয়, ওপির ইনপুট দেওয়া হয়?
not2qubit

যথেষ্ট ফর্সা। সাধারণত আমার কাছে বিশদ স্টাফ করার সময় নেই এবং আমি কেবল সহায়ক বিটগুলি ফেলে দিচ্ছি (বিশেষত যদি আমি রাস্তার নিচে একই ঠিক একই প্রশ্নে চলে যাই) তবে আমি গেটচু।
করিশিম্মন

1
এটি অবশ্যই সবচেয়ে মার্জিত সমাধান এবং অন্যান্য উত্তরগুলির তুলনায় আসলে প্রশ্নের উত্তর দেয়। এবং ব্যাখ্যা জন্য আপনাকে ধন্যবাদ!
ক্যাথি হা

4

আমি কয়েকটি লাইনের কোডে একটি সমাধান কার্যকর করেছি যা বেশ নির্ভরযোগ্যভাবে কাজ করে।

এইচটিএমএল উপাদান থাকা যেখানে আমি কাস্টম বিকল্পগুলি পাস করতে চাই:

<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')));

data-কিছু ফ্রেমওয়ার্ক / লাইব্রেরির মতো সিউডো-কাস্টম বৈশিষ্ট্য তৈরি করার পরিবর্তে বৈশিষ্ট্যটি ব্যবহার করার জন্য +1 ।
জন

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
কেবল একটি ধারণা - দ্বিতীয় বিভক্তির পরিবর্তে (':') আপনি "ম্যানুয়ালি" স্ট্রিংটি "ম্যানুয়ালি" এফআইআরএসটি কোলন দ্বারা সূচিপত্র "(": ") ব্যবহার করে ভাগ করতে পারেন এবং এই কোলন অবধি স্ট্রিংয়ের অংশটিকে কী হিসাবে এবং বাকী অংশটি কোলনের পরে বিবেচনা করবেন মূল্য.
ওন্দ্রেজ ভেনকোভস্কি

2

আমি JSON5 ব্যবহার করছি , এবং এটি বেশ ভাল কাজ করে।

ভাল অংশটি হ'ল না eval এবং নেই new Function , ব্যবহার করা খুব নিরাপদ।


1

এটি সর্বজনীন কোড your

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 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পেতে পারেন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.