Я стримую такий предмет {'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).