我正在尝试使用一个在响应正文中具有以下结构的 api:
{"flag": false,
"codes":[
"a3f2b9ddf8886b04993632"]}
在 Postman 执行 curl 时,响应正是这个。
但是当我使用 restTemplate.exchange(...) 返回响应正文时,它总是返回 codes: [[object Object]]
UriComponentsBuilder builder = UriComponentsBuilder.fromUri(URL...); //cannot show partner's url here
header.add("Accept", MediaType.APPLICATION_JSON_VALUE);
header.add("Content-Type", MediaType.APPLICATION_JSON_VALUE);
ResponseEntity<String> resourceHttpEntity = restTemplate.exchange(
builder.toUriString(),
HttpMethod.GET,
new HttpEntity<>(header), String.class); //header also has an authorization bearer token that is in another class
System.out.println(resourceHttpEntity.getBody());
来自此的响应正文:
{"flag":false,"codes":["[object Object]"]}
我看到了一些发生这种情况的例子,但是在 Javascript 中,我们使用 JSON.stringfy 来解决它。
但是在 Java 中我们没有这个选项。不知道是配置错误还是什么。
即使我尝试使用 String[], ArrayList 为该属性使用类模型来获取此响应主体。尝试在String.class、JSonNode.class中进行转换,结果是这样返回的。
我尝试使用 objectMapper 进行转换,甚至使用 HTTPURLConnection 进行测试以确认它正在发生同样的事情。我也有同样的结果。
有什么建议吗?
答案 0 :(得分:0)
如果你需要以 Json 格式打印通用对象的内容,你可以按如下方式打印:
ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
System.out.println(ow.writeValueAsString(object));
// Or better log.info(ow.writeValueAsString(object);
如果您不需要格式化输出,您可以在 objectMapper
上直接调用 writeValueAsString
:
可用于将任何 Java 值序列化为字符串的方法
System.out.println(new ObjectMapper().writeValueAsString(object));
在问题更新后更新答案。
您正在调用的远程服务似乎正在返回您在更新后的答案中显示的正文。 您的代码将正文视为一个简单的字符串,因此在客户端(您的代码)上没有任何操作。这意味着对于特定值,服务器端(您正在调用的 Web 服务)可能正在执行一些奇怪的操作(可能是从 bean 到 json 的转换),从而生成此输出。
您有多种检查方法:
对于前两个替代方案,您必须确保使用与 java 代码使用的数据完全相同的数据。并在同一台机器上执行它们(可能是代理可以改变调用的行为)。
答案 1 :(得分:0)
我们发现代码中已有的 RestTemplate @Bean 导致了这个问题。所以我只是从头开始实例化一个新的 RestTemplate,问题就解决了。
感谢您抽出宝贵时间。
答案 2 :(得分:0)
创建具有以下属性的 Java 类并用作响应实体类型。
rDate | track | AvgOdds | odds1 | odds2 | odds3
--------------------------------------------------
01/06/2021 | Ascot | 7 | 3 | 3 | 15
01/06/2021 | Epsom | 3 | 2 | 3 | 4