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

RestTemplate调用Rest服务遇JSON解析错误,需直接发送JSON串请求

解决JSON解析错误并直接发送/接收JSON字符串

问题根源

你碰到的Cannot construct instance of Person...错误,本质是RestTemplate默认会把请求体参数当作Java对象来序列化,但你传入的已经是JSON字符串了,它反而会尝试把这个字符串转成Person类,这就导致了反序列化失败。

解决方案步骤

要直接发送JSON字符串并接收JSON格式的响应,你需要调整代码做这几件事:

  • 给请求设置正确的Content-Type: application/json头,明确告诉服务端你发送的是JSON数据
  • 使用HttpEntity包装JSON字符串和请求头,避免RestTemplate自动序列化你的字符串
  • 调用RestTemplate的exchange方法,明确指定响应类型为String,这样就能直接拿到返回的JSON字符串

修改后的代码示例

@Component
public class CallRestService implements CommandLineRunner {
    @Autowired
    private RestTemplate restTemplate;

    @Override
    public void run(String... args) throws Exception {
        callRestService();
    }

    private void callRestService() {
        // 补全你的完整JSON请求体
        String requestBody = "{\"id\":\"1\",\"firstName\":\"replacedFirstName\",\"lastName\":\"replacedLastName\"}";

        // 1. 设置请求头,指定Content-Type为application/json
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);

        // 2. 用HttpEntity包装请求体和请求头
        HttpEntity<String> requestEntity = new HttpEntity<>(requestBody, headers);

        // 3. 调用exchange方法发送请求,指定响应类型为String
        String responseJson = restTemplate.exchange(
                "替换为你的Rest服务实际URL",  // 替换成你要调用的服务地址
                HttpMethod.POST,   // 根据服务要求调整请求方式(GET/POST/PUT等)
                requestEntity,
                String.class       // 直接接收JSON字符串作为响应
        ).getBody();

        // 处理或打印返回的JSON字符串
        System.out.println("服务返回的JSON: " + responseJson);
    }
}

额外注意事项

  • 确保你的Rest服务端支持接收JSON格式请求,并且返回的也是JSON格式响应
  • 如果是自定义配置的RestTemplate,要保证StringHttpMessageConverter存在(默认RestTemplate会包含这个转换器,但如果手动替换了消息转换器,记得手动添加它)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:57:09