使用Jackson Java库动态更改JsonProperty名称

时间:2019-04-25 08:58:46

标签: java json serialization jackson jackson-databind

我使用type将下面的Jackson 2.9.8转换为POJO

JSON

在结果public class ResponseEntity implements Serializable { private static final long serialVersionUID = 1L; private int total_record_count; private int filtered_record_count; @JsonProperty("list") private List<Map<String,Object>> entityList; public ResponseEntity(List<Map<String,Object>> entityList) { this.entityList = entityList; this.filtered_record_count = entityList.size(); } public int getTotal_record_count() { return total_record_count; } public void setTotal_record_count(int total_record_count) { this.total_record_count = total_record_count; } public int getFiltered_record_count() { return filtered_record_count; } public void setFiltered_record_count(int filtered_record_count) { this.filtered_record_count = filtered_record_count; } public List<Map<String, Object>> getEntityList() { return entityList; } public void setEntityList(List<Map<String, Object>> entityList) { this.entityList = entityList; } } 中, entityList 成员的值映射为 list 键,如下所示:用JSON注释:

@JsonProperty("list")

但是我需要使用不同的名称对其进行自定义。对于某些响应,应该为{ "list" : [ { "id" : "IID000000002129959", "attr1" : "MY", "attr2" : "sd", "attr3" : true }] } busines1等。

如何使business2的名称动态化?

1 个答案:

答案 0 :(得分:0)

您可以在构造函数中提供名称,并使用JsonAnyGetter。解决方案如下:

import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

import java.io.Serializable;
import java.util.Collections;
import java.util.List;
import java.util.Map;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        ResponseEntity entity = new ResponseEntity("dynList",
                Collections.singletonList(Collections.singletonMap("key", "value1")));

        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);

        System.out.println(mapper.writeValueAsString(entity));
    }
}

class ResponseEntity implements Serializable {

    private static final long serialVersionUID = 1L;
    private int total_record_count;
    private int filtered_record_count;

    private String propertyName;

    @JsonIgnore
    private List<Map<String, Object>> entityList;

    public ResponseEntity(String propertyName, List<Map<String, Object>> entityList) {
        this.propertyName = propertyName;
        this.entityList = entityList;
        this.filtered_record_count = entityList.size();
    }

    @JsonAnyGetter
    public Map<String, Object> otherProperties() {
        return Collections.singletonMap(propertyName, entityList);
    }

    // other methods
}

打印:

{
  "total_record_count" : 0,
  "filtered_record_count" : 1,
  "dynList" : [ {
    "key" : "value1"
  } ]
}