序列化和反序列化过程中 JSON 属性的不同名称

新手上路,请多包涵

是否有可能:在类中有一个字段,但在杰克逊库中的序列化/反序列化期间有不同的名称?

例如,我有“坐标”类。

 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:无法识别的字段“红色”

原文由 kiRach 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 928
2 个回答

刚刚测试,这有效:

 public class Coordinates {
    byte red;

    @JsonProperty("r")
    public byte getR() {
      return red;
    }

    @JsonProperty("red")
    public void setRed(byte red) {
      this.red = red;
    }
}

这个想法是方法名称应该不同,因此杰克逊将其解析为不同的字段,而不是一个字段。

这是测试代码:

 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

原文由 bezmax 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用 @jsonAlias 在 jackson 2.9.0 中引入的

例子:

 public class Info {
  @JsonAlias({ "red" })
  public String r;
}

这在序列化期间使用 r ,但允许 red 作为反序列化期间的别名。不过,这仍然允许 r 也被反序列化。

原文由 Asura 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题