如何构建Java对象结构实现嵌套JSON反序列化至指定POJO
解决方案:处理含动态键的JSON反序列化问题
核心结论
必须自定义反序列化逻辑——在线生成器仅能适配固定结构的JSON,完全无法处理Incident::xxx这类动态键的场景。
具体实现方案(以Jackson为例)
- 定义目标Test类
public class Test { private String id; private String title; // 构造方法、getter/setter自行补充 } - 自定义反序列化器
继承JsonDeserializer,遍历JSON中的动态键,提取嵌套结构内的id和title:public class TestListDeserializer extends JsonDeserializer<List<Test>> { @Override public List<Test> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { List<Test> testList = new ArrayList<>(); JsonNode rootNode = p.getCodec().readTree(p); // 遍历所有动态键(如Incident::xxx) for (Iterator<String> it = rootNode.fieldNames(); it.hasNext(); ) { JsonNode incidentNode = rootNode.get(it.next()); Test test = new Test(); test.setId(incidentNode.get("id").asText()); test.setTitle(incidentNode.get("title").asText()); testList.add(test); } return testList; } } - 注册并使用反序列化器
ObjectMapper mapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.addDeserializer(List.class, new TestListDeserializer()); mapper.registerModule(module); // jsonString为原始JSON字符串 List<Test> testList = mapper.readValue(jsonString, new TypeReference<List<Test>>() {}); - 轻量替代方案:Map过渡
若不想编写自定义反序列化器,可先将JSON反序列化为Map,再转换为Test对象:Map<String, Map<String, String>> rawMap = mapper.readValue(jsonString, new TypeReference<Map<String, Map<String, String>>>() {}); List<Test> testList = rawMap.values().stream() .map(map -> new Test(map.get("id"), map.get("title"))) .collect(Collectors.toList());
补充说明
- 若动态键对应的嵌套结构包含更多字段,只需在Test类中新增属性,同步修改反序列化逻辑即可。
- 若使用Gson框架,逻辑完全相通——自定义
JsonDeserializer或用Map过渡均适用。
内容的提问来源于stack exchange,提问作者Aryem_Chizhov
相关产品推荐
相关产品推荐

