如何使用Jackson将Java List序列化为无外层字段的JSON数组
如何用Jackson将MyResponse直接序列化为内部Data的JSON数组?
这问题我之前也碰到过,有两种常用的方案能解决,看你的需求场景来选就行:
方案一:直接序列化内部的data列表
这是最直观的临时解决方案——既然你要的就是data字段里的数组,那直接拿这个字段去序列化就好了,不需要改动原类结构:
// 初始化ObjectMapper ObjectMapper mapper = new ObjectMapper(); // 假设你已经实例化并填充了MyResponse对象 MyResponse myResponse = new MyResponse(); // 直接序列化data字段 String jsonArray = mapper.writeValueAsString(myResponse.getData());
这样输出的结果就是你想要的:[ { "id": 115125, "name": "AAAY" } ]
方案二:用@JsonValue注解让类默认序列化为数组
如果你希望每次序列化MyResponse对象时,都自动输出内部的data数组(不需要每次手动取字段),可以给MyResponse的data字段或者它的getter方法加上@JsonValue注解,告诉Jackson:这个对象的序列化结果就用这个字段的值来表示。
修改后的MyResponse类:
import com.fasterxml.jackson.annotation.JsonValue; import java.util.List; public class MyResponse { private List<Data> data; // 给getData方法添加@JsonValue注解 @JsonValue public List<Data> getData() { return data; } // 别忘了添加setter或者构造方法来初始化data public void setData(List<Data> data) { this.data = data; } public static class Data { private long id; private String name; // Jackson需要getter来序列化字段,或者给字段加@JsonProperty public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } }
之后直接序列化MyResponse对象就会得到目标JSON:
String jsonArray = mapper.writeValueAsString(myResponse);
补充:如果需要支持反序列化
要是你之后还要把JSON数组反序列化成MyResponse对象,可以配合@JsonCreator注解添加构造方法,让Jackson知道怎么把数组转成MyResponse:
import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; // ...其他导入 public class MyResponse { private List<Data> data; @JsonCreator public MyResponse(@JsonProperty("data") List<Data> data) { this.data = data; } @JsonValue public List<Data> getData() { return data; } // ...其他方法和内部类 }
内容的提问来源于stack exchange,提问作者Robert Strauch
相关产品推荐
相关产品推荐

