使用Jackson反序列化含数组JSON返回null的通用解决方案咨询
解决Jackson反序列化含数组JSON时返回null的问题
你的问题核心是JSON结构与目标类不匹配:你直接将整个外层JSON反序列化成AuthorData,但name、birth_year这些字段并不在JSON顶层,而是嵌套在results[0].authors[0]路径下,所以Jackson找不到对应字段,返回的AuthorData所有属性都是null,最终导致Author对象也没有有效数据。
以下是保持通用性的解决方案:
步骤1:创建匹配JSON层级的实体类(Record)
从顶层到嵌套层依次定义对应结构,既匹配JSON格式,又不破坏原有代码的通用性:
顶层响应类(匹配整个JSON结构)
@JsonIgnoreProperties(ignoreUnknown = true) public record BookResponse( Integer count, String next, String previous, List<BookData> results ) {}
书籍数据类(匹配results数组中的元素)
@JsonIgnoreProperties(ignoreUnknown = true) public record BookData( Integer id, String title, List<AuthorData> authors // 其他不需要的字段可省略,@JsonIgnoreProperties会自动忽略未知字段 ) {}
作者数据类(保留你原有的定义)
@JsonIgnoreProperties(ignoreUnknown = true) public record AuthorData( @JsonAlias("name") String nomeDoAutor, @JsonAlias("birth_year") Integer anoDeNascimento, @JsonAlias("death_year") Integer anoDeFalecimento ) {}
步骤2:修改主类的反序列化逻辑
先将整个JSON反序列化为顶层响应类,再逐层提取嵌套的作者数据:
public class Main { private ApiRequest request = new ApiRequest(); private DataConverter conversor = new DataConverter(); public void principal(){ String jsonResponse = request.consumo("https://gutendex.com/books?search=dom%20casmurro"); // 先反序列化为顶层响应类 BookResponse response = conversor.getData(jsonResponse, BookResponse.class); // 逐层提取作者数据 if (!response.results().isEmpty()) { BookData book = response.results().get(0); if (!book.authors().isEmpty()) { AuthorData authorData = book.authors().get(0); Author author = new Author(authorData); System.out.println(author); } else { System.out.println("无作者数据"); } } else { System.out.println("无书籍结果"); } } }
步骤3:保持DataConverter的通用性
你的DataConverter已经是泛型实现,无需任何修改——它可以适配任何符合Jackson反序列化要求的类(包括新增的BookResponse、BookData),完全满足通用性需求:
public class DataConverter implements IDataConverter { private ObjectMapper mapper = new ObjectMapper(); @Override public <T> T getData(String json, Class<T> classe) { try { return mapper.readValue(json, classe); } catch (JsonProcessingException e) { throw new RuntimeException(e); } } }
关键说明
- 反序列化的核心规则是类结构必须与JSON层级完全匹配,不能跳过外层直接反序列化嵌套对象;
@JsonIgnoreProperties(ignoreUnknown = true)可以忽略不需要的JSON字段,避免因字段过多导致反序列化失败;- 泛型实现的
DataConverter可复用在任何类的反序列化场景中,无需针对特定需求修改。
内容的提问来源于stack exchange,提问作者janiks oliveira
相关产品推荐
相关产品推荐

