Я стримую такий предмет {'foo': 'bar'}
Як я можу повернути рядок до об'єкта?
Я стримую такий предмет {'foo': 'bar'}
Як я можу повернути рядок до об'єкта?
Відповіді:
Тобі потрібно JSON.parse() рядка.
var str = '{"hello":"world"}';
try {
var obj = JSON.parse(str); // this is how you parse a string into JSON
document.body.innerHTML += obj.hello;
} catch (ex) {
console.error(ex);
}
JSON.parseє протилежністю JSON.stringify.
JSON.stringifyі JSON.parseмайже є опозитами, і "зазвичай" така штука спрацює:
var obj = ...;
var json = JSON.stringify(obj);
var obj2 = JSON.parse(json);
так що obj і obj2 "однакові".
Однак слід враховувати деякі обмеження. Часто ці питання не мають значення, оскільки ви маєте справу з простими об'єктами. Але я проілюструю деякі з них тут, використовуючи цю помічну функцію:
function jsonrepack( obj ) { return JSON.parse(JSON.stringify(obj) ); }
Ви отримаєте лише ownPropertiesоб'єкт і втратите прототипи:
var MyClass = function() { this.foo="foo"; }
MyClass.prototype = { bar:"bar" }
var o = new MyClass();
var oo = jsonrepack(o);
console.log(oo.bar); // undefined
console.log( oo instanceof MyClass ); // falseВи втратите ідентичність:
var o = {};
var oo = jsonrepack(o);
console.log( o === oo ); // falseФункції не виживають:
jsonrepack( { f:function(){} } ); // Returns {}Об'єкти дати закінчуються як рядки:
jsonrepack(new Date(1990,2,1)); // Returns '1990-02-01T16:00:00.000Z'Невизначені значення не виживають:
var v = { x:undefined }
console.log("x" in v); // true
console.log("x" in jsonrepack(v)); // falseОб'єкти, які забезпечують toJSONфункцію, можуть поводитись неправильно.
x = { f:"foo", toJSON:function(){ return "EGAD"; } }
jsonrepack(x) // Returns 'EGAD'Я впевнений, що проблеми є і з іншими вбудованими типами. (Все це було протестовано за допомогою node.js, тому ви можете мати дещо іншу поведінку залежно від вашого оточення).
Якщо це має значення, його іноді можна подолати, використовуючи додаткові параметри JSON.parseта JSON.stringify. Наприклад:
function MyClass (v) {
this.date = new Date(v.year,1,1);
this.name = "an object";
};
MyClass.prototype.dance = function() {console.log("I'm dancing"); }
var o = new MyClass({year:2010});
var s = JSON.stringify(o);
// Smart unpack function
var o2 = JSON.parse( s, function(k,v){
if(k==="") {
var rv = new MyClass(1990,0,0);
rv.date = v.date;
rv.name = v.name;
return rv
} else if(k==="date") {
return new Date( Date.parse(v) );
} else { return v; } } );
console.log(o); // { date: <Mon Feb 01 2010 ...>, name: 'an object' }
console.log(o.constructor); // [Function: MyClass]
o.dance(); // I'm dancing
console.log(o2); // { date: <Mon Feb 01 2010 ...>, name: 'an object' }
console.log(o2.constructor) // [Function: MyClass]
o2.dance(); // I'm dancing
JSON SPEC
{ bar:"bar" }(з вашого прототипу) не вважається дійсним json, оскільки fooє змінною, а не рядком. Дійсною json потрібно keyбути a string.
JSON.parse. Я просто попереджую, що існує маса випадків, коли неправильно працювати. Якщо ви використовуєте чисті примітивні дані (без класів, прототипів) та лише типи даних, підтримувані JSON (без дат, XML, HTML тощо), тоді ви все в порядку.
X = { foo:"bar" }- те саме, X = { "foo":"bar" }що є тим самим, X = {}; X.foo = "bar"що і те саме, що і X={}; X["foo"] = "bar"отриманий об'єкт однаковий у всіх 4 випадках. Це не має ніякої різниці у валідності створеного JSON.
http://jsbin.com/tidob/1/edit?js,console,output
Нативний об'єкт JSON включає два ключові методи.
1. JSON.parse()
2. JSON.stringify()
JSON.parse()Метод аналізує рядок JSON - тобто відновлення вихідного об'єкта JavaScript
var jsObject = JSON.parse(jsonString);
Метод JSON.stringify () приймає об’єкт JavaScript і повертає його еквівалент JSON.
var jsonString = JSON.stringify(jsObject);
Рекомендується використовувати JSON.parse
Є альтернатива, яку ви можете зробити:
var myObject = eval('(' + myJSONtext + ')');
Як щодо цього
var parsed = new Function('return ' + stringifiedJSON )();
Це більш безпечна альтернатива для eval.
Заціни.
http://jsfiddle.net/LD55x/
Код:
var myobj = {};
myobj.name="javascriptisawesome";
myobj.age=25;
myobj.mobile=123456789;
debugger;
var str = JSON.stringify(myobj);
alert(str);
var obj = JSON.parse(str);
alert(obj);
$("#save").click(function () {
debugger
var xx = [];
var dd = { "firstname": "", "lastname": "", "address": "" };
var otable1 = $("#table1").dataTable().fnGetData();
for (var i = 0; i < otable1.length; i++) {
dd.firstname = otable1[i][0];
dd.lastname = otable1[i][1];
dd.address = otable1[i][2];
xx.push(dd);
var dd = { "firstname": "", "lastname": "", "address": "" };
}
JSON.stringify(alert(xx));
$.ajax({
url: '../Home/save',
type: 'POST',
data: JSON.stringify({ u: xx }),
contentType: 'application/json;',
dataType: 'json',
success: function (event) {
alert(event);
$("#table2").dataTable().fnDraw();
location.reload();
}
});
});
{foo: 'bar'}недійсний JSON (хоча це дійсний вираз JavaScript).