2017-05-30 88 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