将JavaScript对象序列化为JSONstring

我有这个JavaScript原型:

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

我创build一个新的对象:

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

如果我做:

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

结果是:

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

但我需要的types的对象包括在JSONstring,如下所示:

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

有一个快速的方式使用任何框架或东西? 或者我需要在类中实现toJson()方法并手动执行。

谢谢!

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

编辑:

JSON.stringify会将你的类的所有 '属性' JSON.stringify 。 如果只想保留其中的一部分,可以像这样单独指定它们:

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

如果这只是一个JSON你可以stringify一个Json:

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

并parsing为JSON再parsing:

 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} 

那么,一个元素的types是不是标准的序列化,所以你应该手动添加它。 例如

 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

这可能是有用的。 http://nanodeath.github.com/HydrateJS/ https://github.com/nanodeath/HydrateJS

使用hydrate.stringify序列化对象和hydrate.parse以反序列化。

您可以在构造函数上使用命名函数。

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

你可以使用正则expression式从myobject.constructorparsing出“foo”,并使用它来获取名称。

下面是JSON.stringify()函数可以使用JSON数据的另一种方式

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

我以这种方式解决了我的问题,显然不是最好的方式,但很有意思:

我直接更改了json2.js库(与最佳做法相反),更改了方法JSON.stringify(),并在str()函数中读取对象时首先inputtypeof:

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