首页 > 解决方案 > 如何处理可以根据结果数据返回不同 JSON 数据结构的 API 调用

问题描述

我正在尝试使用 RestTemplate 交换编写代码来查询返回歌曲信息的 API。问题是找到数据时数据看起来像这样,但是

{"search":[{"song_id":"4R9o2J","song_title":"xxxx", ...}]

但是如果找不到这首歌就这样

{"search":{"error":"no result"}}

读取有效数据时,我的结果对象如下所示

Data
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class SongSearch {

    List<SongInfo> search;

}

问题是当数据有效时,没有包含信息数组的属性......它是“搜索”的内容:[{....}] 所以我无法创建一个属性即使 not found 消息具有 error 属性,也会在未找到时被忽略。换句话说,搜索属性可以包含一个数组或单个属性,具体取决于是否找到了数据。

我的交换电话如下所示:

ResponseEntity<SongSearch> res = restTemplate.exchange(url, HttpMethod.GET, entity, SongSearch.class);

我已经能够编写在未找到的情况下捕获反序列化异常的代码,但该异常不包含来自 API 的实际错误消息,我想返回该错误消息。我目前可以通过使用不同的对象再次调用来捕获错误来破解它,但这似乎很疯狂。必须有更好的方法来做到这一点。需要明确的是,这不是从客户端返回的实际错误状态......数据只是不同,但它破坏了反序列化。

有人有建议吗?

标签: javajsonjacksonspring-resttemplate

解决方案


推荐阅读