序列化和反序列化过程中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);