在Javascript中反序列化多态JSON
我的客户端代码从服务器获取一个JSON“对象”,然后解析它。已解析的对象包含一个“type”属性,该属性应控制对象的类在Javascript中反序列化多态JSON,javascript,json,polymorphism,Javascript,Json,Polymorphism,我的客户端代码从服务器获取一个JSON“对象”,然后解析它。已解析的对象包含一个“type”属性,该属性应控制对象的类 $.getJSON("foo.json").done(function(data, textStatus, xhr) { $.each(data.objects, function(key, val) { if (val.type = "A") // make val into an object of class A, somehow?
$.getJSON("foo.json").done(function(data, textStatus, xhr) {
$.each(data.objects, function(key, val)
{
if (val.type = "A") // make val into an object of class A, somehow?
...
else if (val.type = "B") // make val into an object of class B somehow?
... etc...
}
}
如何创建正确类型的JavaScript对象而不显式复制每个属性,或者将解析后的对象转换为其他类型
我读了一些关于\uuuu proto\uuuuu
的书,但我觉得这是一个大锤子,它应该是一个小坚果
我看到过关于Java和Jackson的类似问题,但Javascript没有任何问题…您可以这样做
function ObjectFactory() {
this.newInstance = function(val) {
if (val.type == "A") return new A(val);
if (val.type == "B") return new B(val);
}
}
function A(data) {
// do something with the data
this.property = data.property;
}
function B(data) {
// do something with the data
this.property = data.property;
this.bSpecificProperty = data.bSpecificProperty;
}
$.getJSON("foo.json").done(function(data, textStatus, xhr) {
var objectFactory = new ObjectFactory();
var objects = $.map(data.objects, objectFactory.newInstance);
console.log(objects);
}
如果您给出了一个更好的正确类型的示例,以及一些示例数据,我可以提供一个更好的答案。您没有指定要实现的模式(如果有的话),但正如另一个答案所提到的,您必须在对象的构造过程中采用某种约定。不过,您不必明确说明每种类型。。。如果您对JSON数据的完整性感到满意,那么您可能会有点懒散地将JSON数据与合并 我还将包含一个帮助函数,用于解析给定范围内的“类型”——通常在项目中为对象命名名称空间,以避免污染全局范围。例如:
函数名称空间(str,作用域){
范围=范围| |窗口;
var parts=str.split('.');
while(零件长度)
范围=范围[parts.shift()];
返回范围;
}
Foo={};
Foo.Bar=函数(conf){
//某种构造器
$.extend(这个,conf);
};
//测试。。。
var json={
键入:“Foo.Bar”,
var1:1,
var2:2,
var3:3
};
var obj=new(名称空间(json.type))(json);
日志(obj,Foo.Bar的obj实例);
。。。或与您自己的代码相匹配:
$.getJSON(“foo.json”).done(函数(数据、文本状态、xhr){
data.objects=$.map(data.objects,函数(obj){
返回new(名称空间(obj.type))(obj);
});
});
你的答案正是我需要做的-但我想避免在A和B构造函数中的所有显式赋值。我明白了,所以我想如果你将我写的东西与一些.extend
或$.extend
合并。你得到你想要的。通常情况下,如果我处理这样的数据,我会尽量显式,因为最终可能会添加对数据进行读/写的方法。如果你不这样做,它会感觉非常脆弱:/,如果你想这样做,为什么不把它作为一个对象来保存呢。$。extend
正是我想要的!