2011-11-17 92 views
45

我有這個JavaScript的原型:連載的JavaScript對象轉換成JSON字符串

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

和我創建一個新的對象:

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

,如果我這樣做:

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

結果是:

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

,但我需要的是將typeof對象包括JSON字符串,像這樣:

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

有使用任何框架或東西快速路?或者我需要在類中實現toJson()方法並手動執行。

謝謝!

回答

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

編輯:

JSON.stringify將字符串化類的所有 '屬性'。如果你只想保留其中的一部分,你可以像這樣單獨指定它們:

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

它是一個好主意,但不是隻有一個MyClass類,在MyClass裏面我有很多屬性這是對象,我不知道它。 – Kalamarico

+1

您可以使用myobject.constructor。見我的答案或https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/constructor更多信息! –

3

你可以在構造函數中使用一個命名函數。

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

您可以使用正則表達式從myobject.constructor解析'foo'並使用它來獲取名稱。

4

那麼,一個元素的類型不是標準的序列化,所以你應該手動添加它。例如

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

祝你好運!

編輯:將typeof更改爲正確的.constructor。有關Object的構造函數屬性的更多信息,請參閱https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/constructor

3

下面是另一種方式,我們可以JSON數據與JSON.stringify()函數

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

我解決我的問題,這樣一來,顯然不是最好的方式,但有趣的是分享到:

我已直接改變了json2.js庫(相反最佳實踐...),改變方法JSON.stringify()和在STR()函數當讀取對象我把第一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; 
} 

這只是爲了在我的類中添加classname屬性。迭代之後,添加以下語句:

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(",}", "}"); 
10

如果它只是一個JSON可以在字符串化一個JSON:

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

var text = JSON.stringify(obj); 

,並解析成JSON再次被解析:

var myVar = JSON.parse(text); 

如果你擁有的功能在對象使用該序列化:

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

序列化:

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

結果:

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

反序列化:

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

結果:

Object {cons: Array[1], func: function, spoof: function}