【问题标题】:Jackson: Serialize/deserialize with different property name [duplicate]Jackson:使用不同的属性名称进行序列化/反序列化[重复]
【发布时间】:2016-02-11 03:25:08
【问题描述】:

我有这个 POJO:

public class SetPoint {

    private String tagName;
    //more fields

   //getters and setters

}

我从 REST API 获取 SetPoints,对它们执行一些操作,然后再次发送它们。问题是我想从 JSON 中反序列化 SetPoint,例如:

{
    "tagnameOpc" : "6GH783",
    //more fields
}

但是当我发送它们时,我想将 SetPoint 序列化为:

{
    "tagName" : "6GH783"
    //more fields
}

我的意思是,我希望属性 tagName 在每种情况下都被命名为不同的名称。

这可能吗?

【问题讨论】:

    标签: java json serialization jackson


    【解决方案1】:

    尝试为 getter 和 setter 使用不同的 JsonProperty 注释。例如

    @JsonProperty("tagnameOpc")
    void setTagName(String name)
    
    @JsonProperty("tagName")
    String getTagName()
    

    如果这不起作用,请尝试使用额外的设置器

    @JsonIgnore
    void setTagName(String name)
    
    @JsonProperty("tagnameOpc")
    void setTagNameOpc(String name) {
        setTagName(name);
    }
    
    @JsonProperty("tagName")
    String getTagName()
    

    【讨论】:

    • Setter 用于将 Json 字符串反序列化为对象。它们使非公共字段可反序列化。 Getter 用于将对象序列化为 Json。他们使非公共字段可序列化
    【解决方案2】:

    Jackson mix-in annotations 可能会有所帮助。

    您将使用SetPoint 类两次,但为每种序列化/反序列化格式编写不同的混合类,然后为每种情况分别配置 ObjectMapper。

    【讨论】:

      【解决方案3】:

      假设 jsonObject 是一个包含你的 json 的 JSONObject:

      jsonObject.put("tagName", jsonObject.remove("tagnameOpc"));
      

      来自JSonObject documentationjsonObject.remove(key) 返回与该键关联的值,如果没有值,则返回 null。

      【讨论】:

      • 我在使用 MappingJackson2HttpMessageConverter 和 Spring RestTemplate,所以实际上我不直接使用 JSONObject。无论如何,谢谢
      猜你喜欢
      • 2017-11-29
      • 2013-10-09
      • 2021-12-13
      • 2016-08-15
      • 2017-11-21
      • 1970-01-01
      • 2014-05-24
      • 2018-10-31
      相关资源
      最近更新 更多