我正在尝试使用OpenFeign客户端访问API,获取一些JSON,然后将其转换为POJO数组。
以前,我只是简单地获取一个JSON字符串,并使用Gson像这样将其转换为数组
FeignInterface {
String get(Request req);
}
String json = feignClient.get(request);
POJO[] pojoArray = new Gson().fromJson(json, POJO[].class);
这是有效的。我想消除多余的步骤,并假装自动解码JSON并直接直接返回POJO,所以我正在尝试这样做
FeignInterface {
POJO[] get(Request req);
}
POJO[] pojoArray = feignClient.getJsonPojo(request);`
我遇到了这个错误
feign.codec.DecodeException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 2 path $
两种方法都使用相同的构建器
feignClient = Feign.builder()
.encoder(new GsonEncoder())
.decoder(new GsonDecoder())
.target(FeignInterface.class, apiUrl);
有人有什么想法吗?
答案 0 :(得分:0)
您破坏了JSON
有效载荷。序列化之前,您需要删除所有不支持的字符。 Feign
允许这样做:
如果您需要对响应进行预处理,然后再将其提供给解码器, 您可以使用mapAndDecode构建器方法。一个示例用例是 处理仅提供jsonp的API,您可能需要 在将jsonp发送到您选择的Json解码器之前,先对其进行解包:
public class Example {
public static void main(String[] args) {
JsonpApi jsonpApi = Feign.builder()
.mapAndDecode((response, type) -> jsopUnwrap(response, type), new GsonDecoder())
.target(FeignInterface.class, apiUrl);
}
}
因此,您需要在配置中执行以下操作:
trim
响应,并删除有效负载开头和结尾的所有whitespaces
。new_line
个字符,例如:\r\n
,\r
,\n
使用online tool来确保您的JSON
有效负载有效并可以反序列化。