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

Feign Client如何正确处理服务返回的JsonObject类型响应

问题原因

之前三种写法失败的核心原因是Spring Boot默认集成的Feign使用Jackson作为序列化/反序列化工具:

  • Jackson无法直接识别Gson的JsonObject、Fastjson的JSONObject类型,反序列化时要么丢失字段输出{},要么抛出类型不匹配异常
  • 返回Object类型时Jackson会默认将JSON反序列化为LinkedHashMap,无法直接适配后续用Jayway JsonPath解析的需求
最优解决方案(推荐)

直接让Feign接口返回原始JSON字符串,不需要修改任何全局配置,完全避开不同JSON库的兼容问题,拿到字符串后可以直接喂给Jayway JsonPath提取字段。

Feign接口写法

@FeignClient(name = "ABC")
public interface TestDataProviderApi {
   @GetMapping(value = "/v1/path/{data-type}", produces = MediaType.APPLICATION_JSON_VALUE)
    String getData(@PathVariable("data-type") String dataType);
}

调用后解析代码示例

// 调用Feign接口拿到原始JSON字符串
String jsonResponse = testDataProviderApi.getData("你的业务参数");
// 直接用Jayway JsonPath提取对应字段,比如提取a的值
Integer fieldA = JsonPath.read(jsonResponse, "$.a");
备选方案(适配Gson对象接收)

如果确实需要直接用Gson的JsonObject接收响应,可以单独给该Feign客户端配置Gson消息转换器:

1. 自定义Feign配置类

@Configuration
public class GsonFeignConfig {
    @Bean
    public Decoder gsonDecoder() {
        return new SpringDecoder(() -> new HttpMessageConverters(new GsonHttpMessageConverter()));
    }
    
    @Bean
    public Encoder gsonEncoder() {
        return new SpringEncoder(() -> new HttpMessageConverters(new GsonHttpMessageConverter()));
    }
}

2. Feign接口绑定配置

@FeignClient(name = "ABC", configuration = GsonFeignConfig.class)
public interface TestDataProviderApi {
   @GetMapping(value = "/v1/path/{data-type}", produces = MediaType.APPLICATION_JSON_VALUE)
    JsonObject getData(@PathVariable("data-type") String dataType);
}

3. 解析代码示例

JsonObject jsonObject = testDataProviderApi.getData("你的业务参数");
// 转成字符串后用JsonPath解析
Integer fieldA = JsonPath.read(jsonObject.toString(), "$.a");

注意:如果项目同时使用Jackson和Gson,该方案需要注意消息转换器优先级,避免影响其他业务接口的序列化逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:48:01