You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 20:24:52