有没有可能:在Jackson库中序列化/反序列化时,类中有一个字段,但它有不同的名称?
例如,我有"Coordiantes“类。
class Coordinates{
int red;
}
为了从JSON反序列化,我希望格式是这样的:
{
"red":12
}
但是当我序列化对象时,结果应该是这样的:
{
"r":12
}
我试图通过在getter和setter (具有不同的值)上应用@JsonProperty
注释来实现这一点:
class Coordiantes{
int red;
@JsonProperty("r")
public byte getRed() {
return red;
}
@JsonProperty("red")
public void setRed(byte red) {
this.red = red;
}
}
但我有个例外:
红色org.codehaus.jackson.map.exc.UnrecognizedPropertyException:无法识别字段“
”
发布于 2011-12-19 19:26:51
刚刚测试过了,这是可行的:
public class Coordinates {
byte red;
@JsonProperty("r")
public byte getR() {
return red;
}
@JsonProperty("red")
public void setRed(byte red) {
this.red = red;
}
}
这个想法是方法名称应该是不同的,所以jackson将其解析为不同的字段,而不是一个字段。
下面是测试代码:
Coordinates c = new Coordinates();
c.setRed((byte) 5);
ObjectMapper mapper = new ObjectMapper();
System.out.println("Serialization: " + mapper.writeValueAsString(c));
Coordinates r = mapper.readValue("{\"red\":25}",Coordinates.class);
System.out.println("Deserialization: " + r.getR());
结果:
Serialization: {"r":5}
Deserialization: 25
发布于 2017-08-10 00:40:38
你可以使用在jackson 2.9.0中引入的@jsonAlias
示例:
public class Info {
@JsonAlias({ "red" })
public String r;
}
这在序列化期间使用r
,但在反序列化期间允许red
作为别名。不过,这仍然允许对r
进行反序列化。
发布于 2018-02-28 01:45:08
您可以结合使用@JsonSetter和@JsonGetter来分别控制属性的反序列化和序列化。这还允许您保留与实际字段名相对应的标准化getter和setter方法名称。
import com.fasterxml.jackson.annotation.JsonSetter;
import com.fasterxml.jackson.annotation.JsonGetter;
class Coordinates {
private int red;
//# Used during serialization
@JsonGetter("r")
public int getRed() {
return red;
}
//# Used during deserialization
@JsonSetter("red")
public void setRed(int red) {
this.red = red;
}
}
https://stackoverflow.com/questions/8560348
复制相似问题