我有一个班级的两个对象。
成员变量包括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值。
我怎么能这样做?细节可能有点模糊,所以我愿意在需要时扩展更多。
谢谢!
答案 0 :(得分:0)
Jackson不是为复杂的数据转换操作而设计的,因此您可能需要通过自定义序列化器/反序列化器,或者使用更简单的Object for Jackson来填充/写出,以及您的内部数据处理对象来处理它。 / p>
但是这套复杂的叠加真的有必要吗? JSON的一个好处是简单性,简化数据表示和处理可能更有意义,而不是尝试添加高级组合逻辑。 KISS原则。