Tôi đang xâu chuỗi một đối tượng như {'foo': 'bar'}
Làm thế nào tôi có thể biến chuỗi trở lại một đối tượng?
Tôi đang xâu chuỗi một đối tượng như {'foo': 'bar'}
Làm thế nào tôi có thể biến chuỗi trở lại một đối tượng?
Câu trả lời:
Bạn cần đến JSON.parse()
chuỗi.
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
là đối nghịch với JSON.stringify
.
JSON.stringify
và JSON.parse
gần như oposites, và "thường" loại điều này sẽ hoạt động:
var obj = ...;
var json = JSON.stringify(obj);
var obj2 = JSON.parse(json);
sao cho obj và obj2 "giống nhau".
Tuy nhiên, có một số hạn chế cần lưu ý. Thông thường những vấn đề này không quan trọng khi bạn xử lý các đối tượng đơn giản. Nhưng tôi sẽ minh họa một số trong số họ ở đây, bằng cách sử dụng chức năng trợ giúp này:
function jsonrepack( obj ) { return JSON.parse(JSON.stringify(obj) ); }
Bạn sẽ chỉ nhận được ownProperties
các đối tượng và mất nguyên mẫu:
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
Bạn sẽ mất danh tính:
var o = {};
var oo = jsonrepack(o);
console.log( o === oo ); // false
Chức năng không tồn tại:
jsonrepack( { f:function(){} } ); // Returns {}
Các đối tượng ngày kết thúc dưới dạng chuỗi:
jsonrepack(new Date(1990,2,1)); // Returns '1990-02-01T16:00:00.000Z'
Các giá trị không xác định không tồn tại:
var v = { x:undefined }
console.log("x" in v); // true
console.log("x" in jsonrepack(v)); // false
Các đối tượng cung cấp một toJSON
chức năng có thể không hoạt động chính xác.
x = { f:"foo", toJSON:function(){ return "EGAD"; } }
jsonrepack(x) // Returns 'EGAD'
Tôi chắc chắn cũng có vấn đề với các loại tích hợp khác. (Tất cả điều này đã được kiểm tra bằng node.js để bạn có thể có hành vi hơi khác nhau tùy thuộc vào môi trường của bạn).
Khi có vấn đề, đôi khi có thể khắc phục bằng cách sử dụng các tham số bổ sung của JSON.parse
và JSON.stringify
. Ví dụ:
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" }
(từ nguyên mẫu của bạn) không được coi là json hợp lệ vì foo
là một biến chứ không phải là một chuỗi. Json hợp lệ cần key
phải là a string
.
JSON.parse
. Tôi chỉ cảnh báo rằng có rất nhiều trường hợp sẽ không xử lý chính xác. Nếu bạn đang sử dụng dữ liệu nguyên thủy thuần túy (không có lớp, nguyên mẫu) và chỉ các kiểu dữ liệu được JSON hỗ trợ (không có ngày, XML, HTML, v.v.) thì bạn vẫn ổn.
X = { foo:"bar" }
cũng giống như X = { "foo":"bar" }
trong đó X = {}; X.foo = "bar"
giống như X={}; X["foo"] = "bar"
đối tượng kết quả là giống hệt nhau trong cả 4 trường hợp. Điều đó không có sự khác biệt đối với tính hợp lệ của JSON được tạo.
http://jsbin.com/tidob/1/edit?js,console,output
Đối tượng JSON gốc bao gồm hai phương thức chính.
1. JSON.parse()
2. JSON.stringify()
Các JSON.parse()
phương pháp phân tích một chuỗi JSON - tức là xây dựng lại các đối tượng JavaScript gốc
var jsObject = JSON.parse(jsonString);
Phương thức JSON.opesify () chấp nhận một đối tượng JavaScript và trả về tương đương JSON của nó.
var jsonString = JSON.stringify(jsObject);
Khuyến nghị là sử dụng JSON.parse
Có một cách khác bạn có thể làm:
var myObject = eval('(' + myJSONtext + ')');
Còn cái này thì sao
var parsed = new Function('return ' + stringifiedJSON )();
Đây là một thay thế an toàn hơn cho eval
.
Kiểm tra này.
http://jsfiddle.net/LD55x/
Mã số:
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 không hợp lệ (trong khi đó là biểu thức javascript hợp lệ).