Java如何在序列化过程中使用Jackson ObjectMapper来连接Item类中的两个字段?

问题描述:

我有一个类:Java如何在序列化过程中使用Jackson ObjectMapper来连接Item类中的两个字段?

public class Item { 
    private String firstName; 
    private String lastName; 
    private int age; 
} 

当我将其转换为JSON,我想的名字和姓氏字段组合。因此,像:

ObjectMapper objMapper = createMapper(); 
Item item = new Item("Bob", "Smith", 190); 
String json = objMapper.writeValueAsString(item); 

但我想的JSON看起来如下:

{ 
    "Name": "Bob Smith", 
    "age" : "190" 
} 

代替:

{ 
    "firstName": "Bob", 
    "lastName" : "Smith", 
    "age" : "190" 
} 

一样聪明,我想走另一条路周围。所以,如果字符串anotherString是,

{ 
    "Name": "Jon Guy", 
    "age" : "20" 
} 

objMapper.readValue(anotherString, Item); 

应该产生一个项目与姓=乔恩,姓氏=盖伊,年龄= 20

+0

不要连接那个值。写一个新的get方法:public getName(){return firstName +“”+ lastName);} – Stefan

+0

这对于将JSON转换为Item对象的逆向过程仍然有效吗?我可以将JSON字段“Name”转换为“firstName”和“lastName”吗? – user3768533

作为一般的抬起头来,https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations会告诉你什么样的注解会帮助你与杰克逊的东西。

无论如何,两件事情都发生在这里:

  • 要序列的附加字段
  • 你想从你的对象进行解析附加字段(我其实告诫这个下文)

我假设你想存储名称字段在一起,可能用于显示的目的。

根据我的经验,我会告诫你不要真正从任何传入的JSON解析fullName属性,因为它实际上并非微不足道(例如,想象一个名为Lauren de Silva的人)。

的解决方案,我要提出是要与序列化的名称属性的对象,但会忽略当对象被读回该属性。

我们现在要做的是自定义POJO,而不是做任何特殊的序列化代码:

public class Item { 
    private String firstName; 
    private String lastName; 
    private int age; 

    @JsonProperty("Name",access=Access.READ_ONLY) 
    public String getName() { 
    return(firstName + " " + lastName); 
    } 
} 

我当然会建议增加空检查到的各种方法,如果您的firstName或lastName的可能是空白或空。

+0

感谢您的回复!我认为你对反序列化是正确的,我会避免这样做。对于序列化,我们实际上是在之后将JSON写入数据库。我们将使用“Name”作为数据库的哈希键。我的团队坚持不要触及Item类,并改变序列化,以便将来可以轻松修改散列键(通过更改序列化而不是Item类)。有没有简单的方法来做到这一点? – user3768533

+0

是的,有,你将需要创建一个自定义序列化程序。如果你想创建一个自定义的票,我也会覆盖那个。 – TreyE

+0

如果还不算太晚,我想带你参加这个活动:) http:// *。COM /问题/ 38231692 /定制串行器和解串器对连击两字段-期间,serializatio – user3768533