বস্তুর স্ট্রিংটিকে 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এইভাবে একটি অ্যাট্রুবউটে সংরক্ষণ করা হয় : <div data-object="{hello:'world'}"></div>এবং আমি এইচটিএমএলে একক উদ্ধৃতি ব্যবহার করতে চাই না (যাতে এটি সম্ভবত বিশ্বাসযোগ্য নয়)
স্নোর্পেই

5
@ স্নোর্পাই: <div data-object='{"hello":"world"}'></div>এটি 100% বৈধ এইচটিএমএল (একক উদ্ধৃতিতে এটির উপর নির্ভর করে বা কী করতে পারে?)। আপনি যদি এইভাবে এটি করেন তবে আপনি এটি করতে পারেন JSON.parseএবং এটি ঠিকঠাক কাজ করবে। দ্রষ্টব্য: কীগুলিও উদ্ধৃত হওয়া দরকার।
রকেট হাজমত

@ রকেট আপনার প্রচেষ্টার জন্য ধন্যবাদ! আমি কেবল এইচটিএমএল (এটি 100% বৈধ হলেও) এবং জেএসওন স্বরলিপিতে একক উদ্ধৃতি ব্যবহার করার আশেপাশে কোনও উপায় খুঁজে পেতে চেয়েছিলাম।
স্নোর্পি

@ স্নোর্পি: এগুলি প্রায় জেএসওএনকে এইচটিএমএল বৈশিষ্ট্যে প্রথম স্থানে স্থাপন করা নয়। আমার ধারণা আপনি ডাবল কোট ব্যবহার করতে পারবেন এবং জেএসএনে থাকাগুলি থেকে রক্ষা পাবেন <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- এনকোড করতে নিশ্চিত হন)।


এটি স্ট্রিংটি যদি নির্ভরযোগ্য উত্স থেকে হয় তবে এটি এর পরিবর্তে আমরা কেন এটি বৈধ জসন হিসাবে রূপান্তর করব তা বিবেচ্য নয়।
allenhwkim

2
@ অ্যালেনহউকিম ধারণাটি অবৈধ জেএসএন থেকে বৈধ জেএসএন রূপান্তর করা, সুতরাং evalস্ট্রিংটিকে একটি জাভাস্ক্রিপ্ট অবজেক্টে রূপান্তরিত করে (যা কাজ করে, যতক্ষণ না স্ট্রিংটি বৈধ জাভাস্ক্রিপ্ট উপস্থাপন করে, যদিও এটি বৈধ জেএসএন নয়)। তারপরে JSON.stringifyএকটি অবজেক্ট থেকে কোনও (বৈধ) JSON স্ট্রিংয়ে ফিরে আসে। কলিংটি evalবিপজ্জনক যদি স্ট্রিংটি কোনও বিশ্বস্ত উত্স থেকে না হয় কারণ এটি আক্ষরিকভাবে এমন কোনও জাভাস্ক্রিপ্ট চালাতে পারে যা ক্রস-সাইট স্ক্রিপ্টিং আক্রমণের সম্ভাবনা খুলে দেয়।
ম্যাথু ক্রামলে

2
eval এই ক্ষেত্রে এখনও খারাপ কাজ করবে যদি স্ট্রিংটি নির্মিত হয়, উদাহরণস্বরূপ, এর মতো: var str = "(ফাংশন ()) {কনসোল.লগ (\" খারাপ \ ")}) ()";
রোন্ডো

ইভাল () ব্যবহার করে জেএস কোড কার্যকর করা হবে। এটি সহজেই অপব্যবহার করা যায়।
ফিসনন

@ অ্যালেনহক্কিম: আমরা কখনই কোনও উত্সকে বিশ্বাস করি না। আইটির উপর বিশ্বাস মানে চেক, চেক এবং আবার চেক করুন।
লাসজলো ভার্গা

110

আপনার স্ট্রিংটি বৈধ JSON নয়, সুতরাং JSON.parse(বা jQuery এর $.parseJSON) কাজ করবে না।

একটি উপায় evalহ'ল "অবৈধ" জেএসওন "পার্স" করতে এবং তারপরে stringifyএটি বৈধ জেএসএন-তে "রূপান্তর" করতে হবে।

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ডি হতে পারে । প্রথমত, তারা কী এবং মান উভয়ই ডাবল উদ্ধৃতিতে উদ্ধৃত হওয়া প্রয়োজন। এটি দেখতে দেখতে হবে (এইচটিএমএলে একক উদ্ধৃত বৈশিষ্ট্যগুলি বৈধ):

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

এখন, আপনি কেবল JSON.parse(বা jQuery এর $.parseJSON) ব্যবহার করতে পারেন ।

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


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

নতুন স্ট্রিং (জসনটেক্সট) এর মাধ্যমে স্ট্রিং অবজেক্টে জসনটেক্সট রূপান্তর করা টাইপ সুরক্ষার জন্য সম্ভবত আরও ভাল।
অস্পষ্ট বিশ্লেষণ

@ ফুজায়ানালাইসিস: না, আদিম মোড়ক কখনও ব্যবহার করা উচিত নয়।
রাই-

1
@ লুইসম্যাকমাহন
পিক্সেল 67

24

আমি আশা করি এই ছোট্ট ফাংশনটি অবৈধ জেএসএন স্ট্রিংটিকে বৈধ একটিতে রূপান্তর করে।

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. পার্স করে আমাদের কোডটি ডি-ইভালিফাইফাই করার চেষ্টা করছি এবং এটি একটি ভাল সমাধানের মতো দেখায়। আমরা এখনও হাতে ধ্রুব প্রতিস্থাপন পরিচালনা করতে হবে, কিন্তু কমপক্ষে এটি এই ক্ষেত্রে থাকতে পারে।
রাভেমির

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
@ রকেট: আপনি ভুল বলেছেন। ক) eval()এটি করার একমাত্র উপায়। খ) আমি ওপিকে এটি সম্পর্কে সতর্ক করেছিলাম। গ) ম্যাথু ক্রামলির উত্তরটি দেখুন এবং আরও ভাল ব্যাখ্যাটি ভাবেন। (ওহ, এবং ডি) বিবৃতিটি eval()খারাপ এই সাধারণ আকারে আজেবাজে কথা))
টমলাক

2
@ রকেট: আহ, ঠিক সেখানে ভুল বোঝাবুঝি। দুঃখিত, আমি ভেবেছিলাম ডাউন-ভোটটি আপনার। :)
টমলাক

1
@ কিউবস্লাভ: এটি দুর্দান্ত কাজ করে, আপনি কি এটিও পরীক্ষা করে দেখেছেন? তিনি করছেন eval("var x = " + str + ";")যা সম্পূর্ণ বৈধ জেএস। আপনার দরকার নেই var x = ({a:12})
রকেট হাজমত

2
@kuboslav এটি আই 7 তে কাজ করে না কারণ আই 7 এর নেটিভ জেএসওএন সমর্থন নেই। এটি ব্যবহার করার সাথে সাথে এটি কাজ শুরু করবে json2.js। এত ট্রিগার-খুশি হবেন না।
তোমালাক

4

দাবি অস্বীকার: ঘরে বসে এটিকে চেষ্টা করবেন না বা এমন কোনও জিনিসের জন্য যা আপনাকে গুরুতরভাবে নেবে:

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

সেখানে, আমি এটি করেছি।
এটি না করার চেষ্টা করুন, ইভাল আপনার পক্ষে খারাপ AD উপরে উল্লিখিত হিসাবে, পুরানো ব্রাউজারগুলির জন্য ক্রকফোর্ডের জেএসএন শিম ব্যবহার করুন (আই 7 এবং তার চেয়ে কম)

এই পদ্ধতিটির জন্য আপনার স্ট্রিংকে বৈধ জাভাস্ক্রিপ্ট হতে হবে , যা একটি জাভাস্ক্রিপ্ট অবজেক্টে রূপান্তরিত হবে যা জেএসএনে সিরিয়ালায়িত করা যেতে পারে।

সম্পাদনা: রকেটের পরামর্শ মতো স্থির করা হয়েছে।


এটি এমন হওয়া উচিত JSON.stringify(eval('('+str+')'));যা আমি শোক করি না eval, তবে তার স্ট্রিংটি বৈধ নয় JSON JSON.parseকাজ করে না।
রকেট হাজমত

4

এই পুরাতন সুতায় আগ্রহী এমন ব্যক্তির জন্য আমি আমার উত্তরটি রেখেছি।

আমি তৈরি HTML5 এর নিরীক্ষার * পার্সার jQuery জন্য প্লাগ-ইন এবং ডেমো যা জাভাস্ক্রিপ্ট অবজেক্ট মধ্যে একটি বিকৃত JSON স্ট্রিংকে রূপান্তর ব্যবহার না করেই eval()

এটি এইচটিএমএল 5 ডেটা পাস করতে পারে- * বৈশিষ্ট্যগুলি বেলো:

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

বস্তু মধ্যে:

{
    hello: "world"
}

2

ডগলাস ক্রকফোর্ডের একটি রূপান্তরকারী রয়েছে তবে আমি নিশ্চিত নই যে এটি খারাপ জেএসওএনকে ভাল জেএসওনে সাহায্য করবে।

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

আপনাকে "eval" ব্যবহার করতে হবে তারপরে JSON.stringify এর পরে JSON.parse এ ফলাফলটি ব্যবহার করতে হবে।

 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

নতুন ফাংশন () ব্যবহার করা ওয়াল এর চেয়ে ভাল, তবে এখনও কেবল নিরাপদ ইনপুট ব্যবহার করা উচিত।

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 টি সাধারণ রেজেক্স প্রতিস্থাপন ব্যবহার করে এটি করতে পারেন:

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

এটির স্নিগ্ধতার জন্য, আপনি আপনার স্ট্রিং এর মাধ্যমে রূপান্তর করতে পারেন 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 = "{হ্যালো: 'বিশ্ব', স্থান: ['আফ্রিকা', 'আমেরিকা', 'এশিয়া', 'অস্ট্রেলিয়া']}" var fStr = str .replace (/ ([Az] *) (:) / g, '"$ 1":')। স্থান (/ '/ জি, "\" ")

console.log (JSON.parse (fStr))এখানে চিত্র বর্ণনা লিখুন

দুঃখিত আমি আমার ফোনে আছি, এখানে একটি ছবি আছে।


0

একটি রেজেক্স সহ একটি সমাধান এবং ইওল ব্যবহার না করা:

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

আমি বিশ্বাস করি যে একাধিক লাইন এবং ডাবল-কোট "স্ট্রিং" এর পরিবর্তে একক-উদ্ধৃতি 'স্ট্রিং'র সমস্ত সম্ভাব্য উপস্থিতি (/ g পতাকা) এর জন্য কাজ করা উচিত believe



-1

হতে পারে আপনি এটি চেষ্টা করতে হবে:

str = jQuery.parseJSON(str)

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