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