如何在不转义双引号的情况下使用 RestTemplate 发送 JSON 发布请求?

Posted

技术标签:

【中文标题】如何在不转义双引号的情况下使用 RestTemplate 发送 JSON 发布请求?【英文标题】:How to send a JSON post request with RestTemplate without escaping double quotes? 【发布时间】:2021-11-30 10:34:39 【问题描述】:

我目前正在尝试向外部 API 发送请求。我需要准备一个带有包含报告列表的 JSON 正文的 POST 请求,并使用 RestTemplate 发送它。这是我的代码:

//reportsJson is a list of Report objects containing some data  
 String postBody;
    try 
        postBody = objectMapper.copy()
        .setPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE)
        .writeValueAsString(reportsJson);
     catch (JsonProcessingException e) 
        log.error("Failed to serialize report.", e);
        throw new IllegalArgumentException(e);
    
    
    var headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    headers.setBearerAuth(getToken());
    
    HttpEntity<?> entity = new HttpEntity<Object>(postBody, headers);
    var response = restTemplate.exchange(API_URL, HttpMethod.POST, entity, ReportResponse.class);

不幸的是,我从服务器得到的响应是 HTTP 400 Bad Request:

'[...,...,...]' is not of type 'object'

编辑: 我注意到问题与 RestTemplate 中 JSON 中双引号的转义有关,例如:

 \"id\" :  \"name\" : \"xyz\"  ... 

【问题讨论】:

【参考方案1】:

单引号不是您的 json 字符串的一部分;它们被放在那里作为呈现错误消息的一部分。

另外,错误信息是正确的:你的 json 不是一个对象,而是一个(对象的)数组。

检查您正在调用的服务的 API 规范,看看列表是否应该是包装对象的 tan 属性,例如:


    "data” : [<your objects>]

将 json 有效负载作为对象而不是数组被认为是最佳实践。

【讨论】:

我能够使用 POSTMAN 发送一个成功的 POST 请求,使用完全相同的 JSON,作为一个数组 我的意思是直接数组,不用属性包裹到对象上 @Peters_ 将您的有效负载打印到控制台,将其复制并粘贴到邮递员中,看看会发生什么。 是的,这就是我所做的。它使用邮递员工作 一个合乎逻辑的解释是您从代码中调用的 URL 与从邮递员调用的 URL 不同

以上是关于如何在不转义双引号的情况下使用 RestTemplate 发送 JSON 发布请求?的主要内容,如果未能解决你的问题,请参考以下文章

在某些情况下使用双引号解析 CSV

jshtml中的单引号双引号及其转义使用

使用printf而不必转义双引号?

单引号内双引号内转义单引号[重复]

正则表达式匹配双引号内的每个字符串并包含转义引号

CMD命令中的参数带有双引号,如何转义双引号?