问题
I use Jackson 2.9.8
for converting my below POJO
as 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;
}
}
In the result JSON
, value of entityList member is mapped to list key as it's annotated with @JsonProperty("list")
:
{
"list" : [ {
"id" : "IID000000002129959",
"attr1" : "MY",
"attr2" : "sd",
"attr3" : true }]
}
But I need to customise it with different names. For some response it should be busines1
, business2
, etc.
How do I make JsonProperty
name dynamic?
回答1:
You can provide name in constructor and use JsonAnyGetter. Below solution:
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
}
prints:
{
"total_record_count" : 0,
"filtered_record_count" : 1,
"dynList" : [ {
"key" : "value1"
} ]
}
来源:https://stackoverflow.com/questions/55845478/dynamic-change-of-jsonproperty-name-using-jackson-java-library