类中变量的选择性副本

时间:2015-02-26 20:38:23

标签: java

我有一个班级的两个对象。 成员变量包括String,Integer,List(s)。 一个对象 - Obj1,包含成员变量的默认值集(并不一定意味着所有变量都具有默认值)

第二张地图 - Obj2包含为少数变量设置的值,其余为null。现在我希望未在此处设置的变量(null / empty)获取Obj1对象中的值。这归结为选择性复制。

我使用了杰克逊的ObjectMapper:

public static <T> T merge(final T obj1, final T obj2) {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
        Map map1 = mapper.convertValue(obj1, Map.class);//put the variables in a map
        Map map2 = mapper.convertValue(obj2, Map.class);
        map1.putAll(map2);//put all values of obj2 into the default map- obj1 so that they override them 
        T finalObj = mapper.convertValue(map1, (Class<T>) obj1.getClass());//convert it back from map to the Class type.
        return finalObj;
}

我感觉问题JsonSerialize我设置的内容适用于班级中的所有变量。

mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);

但我想在变量级别定义它。对于某些变量,null可能无效,因此我希望使用默认值覆盖它,但对于少数,我希望具有null值。 所以不是在类级别使用 JsonSerialize定义这些限制 - ,其中相同的条件适用于所有成员变量,我想在变量级别定义它是否是好的null/empty)。


更新1:

这里使用的对象是由yaml文件构造的,我需要与默认对象进行选择性合并。有没有办法做到这一点?


更新2:

查看问题的另一种方法是每个变量都有一个isSet属性,我想做一个Obj2.copyAll(Obj1) - 它调用Obj2成员变量的所有setter,它们隐式地设置了null值。


我怎么能这样做?细节可能有点模糊,所以我愿意在需要时扩展更多。

谢谢!

1 个答案:

答案 0 :(得分:0)

Jackson不是为复杂的数据转换操作而设计的,因此您可能需要通过自定义序列化器/反序列化器,或者使用更简单的Object for Jackson来填充/写出,以及您的内部数据处理对象来处理它。 / p>

但是这套复杂的叠加真的有必要吗? JSON的一个好处是简单性,简化数据表示和处理可能更有意义,而不是尝试添加高级组合逻辑。 KISS原则。