2011-11-17 30 views
45

tôi có nguyên mẫu javascript này:serialize javascript đối tượng vào một chuỗi JSON

Utils.MyClass1 = function(id, member) { 
this.id = id; 
this.member = member; 
} 

và tôi tạo ra một đối tượng mới:

var myobject = new MyClass1("5678999", "text"); 

nếu tôi làm:

console.log(JSON.stringify(myobject)); 

Kết quả là:

{"id":"5678999", "member":"text"} 

nhưng tôi cần rằng typeof các đối tượng bao gồm trong chuỗi json, như thế này:

"MyClass1": { "id":"5678999", "member":"text"} 

Có một cách nhanh chóng sử dụng bất kỳ khuôn khổ hoặc một cái gì đó? hoặc tôi cần phải thực hiện phương thức toJson() trong lớp và thực hiện thủ công.

Cảm ơn!

Trả lời

56
var myobject = new MyClass1("5678999", "text"); 
var dto = { MyClass1: myobject }; 
console.log(JSON.stringify(dto)); 

EDIT:

JSON.stringify sẽ stringify tất cả 'tài sản' của lớp học của bạn. Nếu bạn chỉ muốn tồn tại một số người trong số họ, bạn có thể chỉ định riêng từng người trong số họ:

var dto = { MyClass1: { 
    property1: myobject.property1, 
    property2: myobject.property2 
}}; 
+1

của nó là một ý tưởng tốt, nhưng không chỉ có một MyClass lớp, bên trong MyClass tôi có rất nhiều es là đối tượng, và tôi không biết nó. – Kalamarico

+1

Bạn có thể sử dụng myobject.constructor. Xem câu trả lời của tôi hoặc https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/constructor để biết thêm thông tin! –

3

Bạn có thể sử dụng hàm được đặt tên trên hàm tạo.

MyClass1 = function foo(id, member) { 
    this.id = id; 
    this.member = member; 
} 

var myobject = new MyClass1("5678999", "text"); 

console.log(myobject.constructor); 

//function foo(id, member) { 
// this.id = id; 
// this.member = member; 
//} 

Bạn có thể sử dụng regex để phân tích cú pháp 'foo' khỏi myobject.constructor và sử dụng tên đó để lấy tên.

4

Vâng, loại phần tử không được tuần tự chuẩn, vì vậy bạn nên thêm nó theo cách thủ công. Ví dụ:

var myobject = new MyClass1("5678999", "text"); 
var toJSONobject = { objectType: myobject.constructor, objectProperties: myobject }; 
console.log(JSON.stringify(toJSONobject)); 

Chúc may mắn!

chỉnh sửa: loại đã thay đổi thành đúng .constructor. Xem https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/constructor để biết thêm thông tin về thuộc tính hàm tạo cho Đối tượng.

3

Dưới đây là một cách khác mà qua đó chúng ta có thể dữ liệu JSON với JSON.stringify() chức năng

var Utils = {}; 
Utils.MyClass1 = function (id, member) { 
    this.id = id; 
    this.member = member; 
} 
var myobject = { MyClass1: new Utils.MyClass1("5678999", "text") }; 
alert(JSON.stringify(myobject)); 
2

tôi giải quyết vấn đề của tôi theo cách này, không phải là cách tốt nhất rõ ràng nhưng là thú vị để chia sẻ:

tôi đã thay đổi trực tiếp các thư viện json2.js (đối diện với thực hành tốt nhất ...), thay đổi phương pháp JSON.stringify() và trong str() chức năng khi nội dung đã một đối tượng tôi đặt đầu tiên typeof:

// Otherwise, iterate through all of the keys in the object. 
// I have introduced speechModify variable. 
var speechModify = false; 
if(value.classname) { 
    partial.push('"' + value.classname + '":{'); 
    speechModify = true; 
} 

Điều này chỉ để thêm một thuộc tính classname trong các lớp của tôi. Và sau khi lặp lại, thêm câu này:

if(speechModify) 
    partial.push("}"); 

// Join all of the member texts together, separated with commas, 
// and wrap them in braces. 

v = partial.length === 0 
    ? '{}' 
    : gap 
     ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' 
     : '{' + partial.join(',') + '}'; 
gap = mind; 

v = v.replace("{,","{"); 
v = v.replace(",}", "}"); 
4

Điều này có thể hữu ích. http://nanodeath.github.com/HydrateJS/ https://github.com/nanodeath/HydrateJS

Sử dụng hydrate.stringify serialize đối tượng và hydrate.parse để deserialize.

+0

HydrateJS xuất hiện để xử lý chính xác cả hai chức năng tuần tự hóa và tham chiếu vòng tròn. Không có nhiều thư viện nào! +1 –

+0

Thật không may, HydrateJS cũng kém tài liệu và dường như không bị ảnh hưởng –

10

Nếu nó chỉ là một JSON Bạn có thể stringify Một Json:

var obj = { 
    cons: [[String, 'some', 'somemore']], 
    func: function(param, param2){ 
     param2.some = 'bla'; 
    } 
}; 

var text = JSON.stringify(obj); 

và phân tích Để JSON Again By phân tích cú pháp:

var myVar = JSON.parse(text); 

Nếu bạn có chức năng In The Object Sử dụng này Để Serialize:

function objToString(obj, ndeep) { 
    switch(typeof obj){ 
    case "string": return '"'+obj+'"'; 
    case "function": return obj.name || obj.toString(); 
    case "object": 
     var indent = Array(ndeep||1).join('\t'), isArray = Array.isArray(obj); 
     return ('{['[+isArray] + Object.keys(obj).map(function(key){ 
      return '\n\t' + indent +(isArray?'': key + ': ')+ objToString(obj[key], (ndeep||1)+1); 
     }).join(',') + '\n' + indent + '}]'[+isArray]).replace(/[\s\t\n]+(?=(?:[^\'"]*[\'"][^\'"]*[\'"])*[^\'"]*$)/g,''); 
    default: return obj.toString(); 
    } 
} 

Ví dụ

Serialize:

var text = objToString(obj); //To Serialize Object 

Kết quả:

"{cons:[[String,"some","somemore"]],func:function(param,param2){param2.some='bla';}}" 

unserialize:

Var myObj = eval('('+text+')');//To UnSerialize 

Kết quả:

Object {cons: Array[1], func: function, spoof: function} 
Các vấn đề liên quan