使用jackson-databind ObjectMapper将含数字键隐式列表的JSON转为Java对象
解答
结论
可以实现,但无法直接反序列化,因为原JSON中Package数据是以数字为键的独立对象结构,并非标准数组结构,额外配置Jackson的反序列化规则即可满足需求。
推荐实现方案
1. 定义实体类
首先定义Package实体(注意避开JDK自带的java.lang.Package类,建议重命名为PackageInfo避免冲突):
public class PackageInfo { private String packageCode; private String packageNum; // 此处省略无参构造、getter、setter方法 }
然后定义目标响应实体,通过@JsonAnySetter注解收集所有数字键对应的Package对象:
public class ApiResponse { private String message; // 用List接收更方便,也可以直接定义为PackageInfo[]类型 private List<PackageInfo> packages = new ArrayList<>(); // 标准getter、setter public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public List<PackageInfo> getPackages() { return packages; } public void setPackages(List<PackageInfo> packages) { this.packages = packages; } // 所有无法匹配到已知属性的键值对会进入该方法 @JsonAnySetter public void addPackage(String key, PackageInfo pkg) { // 只处理数字键的字段,过滤异常字段 if (key.matches("\\d+")) { this.packages.add(pkg); } } }
2. 反序列化调用
直接用常规的ObjectMapper调用即可:
ObjectMapper objectMapper = new ObjectMapper(); ApiResponse response = objectMapper.readValue(yourJsonStr, ApiResponse.class); // 如需数组,直接调用packages.toArray(new PackageInfo[0])转换即可
其他可选方案
如果不想修改实体类,可以自定义JsonDeserializer<ApiResponse>反序列化器,在反序列化逻辑中手动解析JSON节点,将数字键对应的节点收集为数组赋值给packages属性。
内容的提问来源于stack exchange,提问作者MauroB
相关产品推荐
相关产品推荐

