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

Spring调用Swapi API转换JSON为对象时反序列化错误求解

问题解决:Swapi API反序列化错误修复

错误根源

你调用的Swapi /films/接口返回的是单个JSON对象(包含results数组、count等字段),但你在代码里试图把它反序列化为FilmModel[]数组类型,Jackson无法将对象解析为数组,因此抛出Cannot deserialize value of type [Lcom.starwarsapi.filmsapi.model.FilmModel; from Object value错误。

具体修改步骤

1. 修正FilmServiceImpl的反序列化逻辑

把原来接收数组的代码改成接收单个FilmModel对象,再提取其中的results数组:

@Service
public class FilmServiceImpl implements FilmService {

    @Value("${external.api.url}")
    private String filmBaseUrl;

    @Autowired
    private RestTemplate restTemplate;

    @Override
    public List<FilmResultModel> getAllFilms() {
        // 接收单个FilmModel对象,而非数组
        FilmModel result = restTemplate.getForObject(filmBaseUrl, FilmModel.class);
        // 将results数组转为List返回,若需要可修改的List,用new ArrayList<>(Arrays.asList(result.getResults()))
        return Arrays.asList(result.getResults());
    }
}

2. 调整Service接口的返回类型

修改FilmService,返回实际的电影数据类型FilmResultModel的集合:

public interface FilmService {
    List<FilmResultModel> getAllFilms();
}

3. 调整Controller的返回类型

同步修改FilmController的返回类型,和Service保持一致:

@RestController
@RequestMapping("/films")
public class FilmController {

    @Autowired
    private FilmService filmService;

    @GetMapping
    public List<FilmResultModel> getAllFilms() {
        return filmService.getAllFilms();
    }
}

4. 修正FilmResultModel的字段错误

注意到你在FilmResultModel里把release_date对应的字段写成了releaseData(拼写错误,应该是releaseDate),这会导致该字段无法正确赋值,修正如下:

@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class FilmResultModel {
    private String title;

    @JsonProperty("episode_id")
    private Integer episodeId;

    @JsonProperty("opening_crawl")
    private String description;

    private String director;
    private String producer;

    @JsonProperty("release_date")
    private String releaseDate; // 修正拼写错误

    private String[] characters;
    private String[] planets;
    private String[] starships;
    private String[] vehicles;
    private String[] species;
    private String created;
    private String edited;
    private String url;
}

验证逻辑

修改完成后,RestTemplate会正确将Swapi返回的JSON对象解析为FilmModel,再从中取出电影列表返回,这样就解决了反序列化错误,同时能得到可用的电影对象集合,方便后续实现PUT修改描述的功能。

内容的提问来源于stack exchange,提问作者Corvo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:25:22