[英]Java merge Objects (Json, ObjectMapper)
我想合并两个POJO对象:
MyBean old = new MyBean();
MyBean diff = new MyBean();
在Json他们看起来像这样:
diff: {"nat_udp_update_time":333}
old: {"nat_udp_update_time":15,"static_sip_local_port":1111}
结果需要:
old: {"nat_udp_update_time":333,"static_sip_local_port":1111}
我如何使用ObjectMapper或其他lib?
你提出了一个很广泛的问题。 解决这个问题的一种方法是使用对象映射器将json读入bean对象,然后遍历“diff”bean的成员并将它们放入新bean中。
例如
ObjectMapper mapper = new ObjectMapper();
MyBean old = mapper.readValue("{\"nat_udp_update_time\":15,\"static_sip_local_port\":1111}", MyBean.class);
MyBean diff = mapper.readValue("{\"nat_udp_update_time\":333}", MyBean.class);
// go over all the stuff in diff and set it in old if it's different
if (diff.getNatUdpUpdateTime() != null && !diff.getNatUdpUpdateTime().equals(old.getNatUdpUpdateTime())) {
old.setNatUdpUpdateTime(diff.getNatUdpUpdateTime());
}
// and so on ...
如果你要用bean做很多这样的东西,你可以查看像mapstruct这样的库。 如果您的json是简单的键值对,请考虑使用Map<String, Object>
而不是MyBean
。 请注意,上面的示例假定您不想设置null
diff值。
无需依赖,您可以使用一些反射。
@SuppressWarnings({"unchecked", "rawtypes"})
public static <T> T merge(T a, T b) {
try {
if (a == null)
return b;
else if (b == null)
return a;
Class<T> type = (Class) a.getClass();
T c = type.getDeclaredConstructor().newInstance();
for (Field field : a.getClass().getDeclaredFields()) {
field.setAccessible(true);
Object value = field.get(a);
field.set(c, value == null ? field.get(b) : value);
}
return c;
} catch (ReflectiveOperationException e) {
throw new RuntimeException("Cannot merge objects!", e);
}
}
请记住,这只会合并在给定类型中声明的字段,并且您的类型将需要一个空构造函数。
JSON Patch可以为您做到这一点。 这是一个实现 。
例:
JsonNode target = JsonPatch.apply(JsonNode patch, JsonNode source);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.