2017-05-30 82 views
1

對於一些使用情況下,我需要一個POJO轉換爲另一種POJO與不同領域的名稱。我嘗試使用Jackson對象映射器。它在一定程度上起作用。但最終的結果不是我所期望的。春天開機,傑克遜的Json問題,而序列化和反序列化

public class JacksonTest { 

    public static void main(String[] args) throws IOException{ 
     ObjectMapper mapper = new ObjectMapper(); 
     User user = new User("Deepak", "111", "Singapore"); 
     UserMap newUser = mapper.convertValue(user, UserMap.class); 
     System.out.println("SOUT: " + newUser); 
     System.out.println("Jackson: " + mapper.writeValueAsString(newUser)); 
    } 
} 

class User { 

    User(String name, String id, String address){ 
     this.name = name; 
     this.id = id; 
     this.address = address; 
    } 

    String name; 
    String id; 
    String address; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public String getAddress() { 
     return address; 
    } 

    public void setAddress(String address) { 
     this.address = address; 
    } 
} 

class UserMap implements Serializable { 
    @JsonProperty("name") 
    String name; 

    private Map<String, Object> meta = new HashMap<>(); 

    @JsonAnyGetter 
    public Map<String, Object> any() { 
     return meta; 
    } 

    @JsonAnySetter 
    public void set(String name, Object value) { 
     meta.put(name, value); 
    } 

    @Override 
    public String toString() { 
     return "UserMap{" + 
       "name_new='" + name + '\'' + 
       ", meta=" + meta.keySet().stream().map(x-> x+ ":: "+ meta.get(x)).collect(Collectors.joining(", ")) + 
       '}'; 
    } 
} 

如果你運行,輸出將是:

SOUT:用戶映射{name_new = '迪帕克',元=地址::新加坡,ID :: 111}

傑克遜:{」命名 「:」 迪派」, 「地址」: 「新加坡」, 「ID」: 「111」}

我使用Springboot內部使用傑克遜串行器。它再次轉換NEWUSER對象以普通用戶級。我想以類構造的方式序列化字符串。我想要SOUT格式的輸出。

回答

0

我想你是誤會什麼@JsonAnyGetter/@JsonAnySetter對將,實際上,做。

它允許你創建一個幾乎動態豆,強制以及自願領域。在你的情況下,這個名字是強制性的,所有其他領域都是自願的。

引擎蓋下面是什麼不是您的UserMap被轉換爲User。你看到的是一個序列化的UserMap,但是由於它與對應的User實例具有相同的字段和值,所以它們的序列化形式看起來完全相同。

+0

我瞭解其工作。對於某些需求,我需要的是構造對象類。現在我正在創建一個POJO,並在序列化之前感受所有這些數據。 – xdeepakv

+0

@DeepakSharma我不明白你的意思是「我需要的是構建對象類」。另外,創建POJO並在序列化之前填入數據有什麼問題? – Dave