繁体   English   中英

Jackson序列化属性并将其包装到新对象中

[英]Jackson serialize and wrap attributes into a new Object

以下类的序列化对象产生字符串

public class User implements Serializable{

    private Integer id;
    private String name;
    private Integer pinCode;
    private String city;

    // getters /setters
}

{"id":1,"name":"XYZ","pinCode":123456,"city":"ABC"}

但是我们希望属性pinCode和city应该成为新的Json节点(例如地址节点)的一部分。

所以我对结果的期望是:

{
  "id": 1,
  "name": "XYZ",
  "address": {
    "pinCode": 123456,
    "city": "ABC"
  }
}

无需重新组织类结构并使用Json注释即可完成此操作

在@JsonUnwrapped的完全相反的行上

您可以使用以下解决方法(但最好使用JsonSerialize):

public class User implements Serializable{

    private Integer id;
    private String name;

    @JsonIgnore
    private Integer pinCode;

    @JsonIgnore
    private String city;

    @JsonProperty("address")
    public Map<String, Object> getAddress() {
        Map<String, Object> map = new HashMap<>();
        map.put("pinCode", pinCode);
        map.put("city", city);
        return map;
    }

    //Deserealization
    public void setAddress(Map<String, Object> map) { 
        if(map!=null) { 
            city = (String) map.get("city"); 
            pinCode = (Integer) map.get("pinCode"); 
        } 
    }

    // getters /setters
}

感谢@hemantvsn提供反序列化示例

添加另一个名为Address类,如下所示:

public class Address implements Serializable {

    private Integer pinCode;
    private String city;

    // getters /setters
}

然后在User类中使用Address类,如下所示:

public class User implements Serializable {

    private Integer id;
    private String name;
    private Address address;
    // getters /setters
}

现在,杰克逊给您提供json字符串,例如:

{
  "id": 1,
  "name": "XYZ",
  "address": {
    "pinCode": 123456,
    "city": "ABC"
  }
}

@JsonProperty(“ address.pinCode”)用于在json中设置字段名称。 请参阅文档以获取更多详细信息JsonProperty

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM