序列化和反序列化过程中JSON属性的不同名称
有没有可能:在类库中有一个字段,但在Jackson库的序列化/反序列化过程中有不同的名称?
例如,我有class级“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: Unrecognized field "red"
刚刚testing过,这个工程:
public class Coordinates { byte red; @JsonProperty("r") public byte getR() { return red; } @JsonProperty("red") public void setRed(byte red) { this.red = red; } }
这个想法是,方法名称应该是不同的,所以jacksonparsing为不同的领域,而不是一个领域。
这里是testing代码:
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
我只是将两个不同的getters / setters对绑定到一个variables:
class Coordiantes{ int red; @JsonProperty("red") public byte getRed() { return red; } public void setRed(byte red) { this.red = red; } @JsonProperty("r") public byte getR() { return red; } public void setR(byte red) { this.red = red; } }
你可以使用在jackson 2.9.0中引入的@jsonAlias
例:
public class Info { @JsonAlias({ "r", "red" }) public String r; }
这不是我期待的解决scheme(尽pipe这是一个合法的用例)。 我的要求是允许现有的buggy客户端(已经发布的移动应用程序)使用替代名称。
解决scheme在于提供一个像这样的独立的setter方法:
@JsonSetter( "r" ) public void alternateSetRed( byte red ) { this.red = red; }
有可能有正常的getter / setter对。 你只需要在@JsonProperty
指定访问模式
这是unit testing:
public class JsonPropertyTest { private static class TestJackson { private String color; @JsonProperty(value = "device_color", access = JsonProperty.Access.READ_ONLY) public String getColor() { return color; }; @JsonProperty(value = "color", access = JsonProperty.Access.WRITE_ONLY) public void setColor(String color) { this.color = color; } } @Test public void shouldParseWithAccessModeSpecified() throws Exception { String colorJson = "{\"color\":\"red\"}"; ObjectMapper mapper = new ObjectMapper(); TestJackson colotObject = mapper.readValue(colorJson, TestJackson.class); String ser = mapper.writeValueAsString(colotObject); System.out.println("Serialized colotObject: " + ser); } }
我得到的输出如下:
Serialized colotObject: {"device_color":"red"}
它们必须包含这个function,因为现在为getter和setter设置一个不同的@JsonProperty
得到您所期望的(在同一个字段的序列化和反序列化过程中,不同的属性名称)。 jackson版本2.6.7
你可以写一个serialize类来做到这一点:
公共课程符号
{私人string符号;
private String name; public String getSymbol() { return symbol; } public void setSymbol(String symbol) { this.symbol = symbol; } public String getName() { return name; } public void setName(String name) { this.name = name; }
}
公共类SymbolJsonSerializer扩展JsonSerializer {
@Override public void serialize(Symbol symbol, JsonGenerator jgen, SerializerProvider serializers) throws IOException, JsonProcessingException { jgen.writeStartObject(); jgen.writeStringField("symbol", symbol.getSymbol()); //Changed name to full_name as the field name of Json string jgen.writeStringField("full_name", symbol.getName()); jgen.writeEndObject(); }
}
ObjectMapper mapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.addSerializer(Symbol.class, new SymbolJsonSerializer()); mapper.registerModule(module); //only convert non-null field, option... mapper.setSerializationInclusion(Include.NON_NULL); String jsonString = mapper.writeValueAsString(symbolList);