Đảo ngược của JSON.opesify?


338

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?


6
Lưu ý rằng {foo: 'bar'}JSON không hợp lệ (trong khi đó là biểu thức javascript hợp lệ).
leeme

2
chỉ cần thử JSON.parse. nếu trình duyệt của bạn không có hỗ trợ thì hãy thử json2.js
Anirudha Gupta

10
Các bạn đang đối phó với một lolcat ở đây.
Mũi nhọn

1
Có lẽ tôi nên thêm một câu trả lời (đọc thứ tư) khác nói rằng bạn nên làm JSON.parse ...
Titouan de Bailleul

33
@RobW, hóa ra liên kết google của bạn quay lại câu hỏi này là lượt truy cập hàng đầu. #ironic
Chase Florell

Câu trả lời:


501

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


8
Mẹo chuyên nghiệp: luôn đặt JSON.parse () vào các cấu trúc thử bắt, vì phương thức có thể đánh sập Node / Js của bạn
Spock


62

JSON.stringifyJSON.parsegầ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 ownPropertiescá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 toJSONchứ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.parseJSON.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

1
Theo "JSON là một định dạng văn bản hoàn toàn độc lập với ngôn ngữ nhưng sử dụng các quy ước quen thuộc với các lập trình viên thuộc họ ngôn ngữ C, bao gồm C, C ++, C #, Java, JavaScript, Perl, Python và nhiều ngôn ngữ khác." . Đối với tôi điều này nói rằng JSON chỉ nên được sử dụng cho các loại / dữ liệu bất khả tri ngôn ngữ. Do đó, ví dụ của bạn (mặc dù rất hợp lệ) chỉ liên quan đến JSON trong liên kết với JavaScript và nên được định nghĩa nhiều hơn là JSONP và không phải là JSON thực sự ... IMOJSON SPEC
Chase Florell

Một ví dụ về điều này là { bar:"bar" }(từ nguyên mẫu của bạn) không được coi là json hợp lệfoolà một biến chứ không phải là một chuỗi. Json hợp lệ cần keyphải là a string.
Đuổi theo Florell

3
Tôi đọc OP nói rằng "Tôi đã chuyển đổi một đối tượng javascript thành chuỗi JSON và bây giờ tôi muốn chuyển đổi lại - tôi phải làm thế nào?" Tất cả các câu trả lời khác nói chỉ cần sử dụng 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.
Michael Anderson

Ngoài ra trong Javascript 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.
Michael Anderson

2
Đây là một câu trả lời toàn diện xuất sắc, và xứng đáng hơn là câu trả lời được chấp nhận. Cảm ơn bạn cho công việc tuyệt vời của bạn.
scubbo

6

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

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



5

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.


2

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

-3
$("#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();
        }
    });
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.