簡體   English   中英

Java合並對象(Json,ObjectMapper)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM