2011-11-17 37 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}