当前位置: 首页 > 知识库问答 >
问题:

WebClient无法正确解析JSON响应

曾弘扬
2023-03-14

我希望有人能帮我解决这个问题。

我想用WebClient创建一个Rest客户端,从API中检索响应。所以我创建了我的Spring项目,添加了webflux、lombok和h2。我还创建了一个DTO类“CashAccount”和以下方法:

public String retrieveAccountById(String accountId) {
    return webClient.get()
            .uri(GET_ACCOUNT_BY_ID_V4, accountId)
            .header("Auth-Schema", AUTH_SCHEMA)
            .header("apikey", API_KEY)
            .accept(MediaType.APPLICATION_JSON)
            .retrieve()
            .onStatus(HttpStatus::is4xxClientError, response -> {
                System.out.println("4xx error");
                return Mono.error(new RuntimeException("4xx"));
              })
              .onStatus(HttpStatus::is5xxServerError, response -> {
                System.out.println("5xx error");
                return Mono.error(new RuntimeException("5xx"));
              })
            .bodyToMono(String.class) // .bodyToMono(CashAccount.class)
            .block();
}

当我使用“.bodyToMono(String.class)”时,所有的功能都很好,我收到了结果:

    2:50:27.548 [reactor-http-nio-2] DEBUG org.springframework.core.codec.StringDecoder - [43ed0ff3] [6449a63b-1, L:/192.168.1.72:60756 - R:sandbox.io/210.278.152.97:443] Decoded "{
  "status": "OK",
  "error": [],
  "payload": {"accountId":"80377145","iban":"IT10L01234567890 (truncated)...

相反,当我使用“.bodyToMono(cashcount.class)”时,我会收到一个所有变量都为空的对象:

23:17:31.236 [reactor-http-nio-2] DEBUG org.springframework.http.codec.json.Jackson2JsonDecoder - [43ed0ff3] [77c463f4-1, L:/192.168.1.72:62306 - R:sandbox.io/210.278.152.97:443] Decoded [CashAccount(accountId=null, iban=null, abiCode=null, cabCode=null, countryCode=null, internationalCi (truncated)...]

这里是我的DTO类:

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class CashAccount {

        private String accountId; 
        private String iban; 
        ...
    }

我做错了什么?

共有1个答案

吴康平
2023-03-14

问题是,您试图只将有效负载对象映射到CashAccount。在dto中还应该有一个状态和错误数组。

关于您的json回应:

添加缺少字段的dto

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResponseDto {
  private String status;
  private List<String> error;
  private CashAccount payload;
}

然后改变。bodyToMono(响应班级)

我建议您使用@JsonTest测试您的映射

@JsonTest
class TestMarshalling {

@Autowired ObjectMapper mapper;

@Test
@SneakyThrows
void testmarshalling() {
  String response =
    "{\n"
        + "  \"status\": \"OK\",\n"
        + "  \"error\": [],\n"
        + "  \"payload\": 
     {\"accountId\":\"80377145\",\"iban\":\"IT10L01234567890\"}}";

  var cashAccount = mapper.readValue(response , ResponseDto.class);
  Assertions.assertNotNull(cashAccount.getPayload());
  Assertions.assertNotNull(cashAccount.getPayload().getAccountId());
  Assertions.assertNotNull(cashAccount.getPayload().getIban());
  }
}
 类似资料:
  • GSON不是在一开始就解析我传递的整个JSON字符串吗?因此,最终,我希望新的数据源是对象。那可行吗?

  • 我不知道为什么我的json解析不起作用。这是我正在使用的Api。还有完整json输出的链接http://api.openweathermap.org/data/2.5/forecast/daily?zip=85008 我试图得到每天的最低和最高温度。这是我的代码。引发的异常应该是BEGIN_OBJECT,但在第1行第190列编号。任何帮助不胜感激,谢谢!

  • 问题内容: 我正在尝试从FlickR解析JSON响应,但是遇到了困难。我已经进行了一些测试,并且收到200的响应代码,并且能够使用日志记录拦截器查看实际的JSON。 但是,当我尝试访问JSON对象时,我收到了一个空指针。我觉得这与我的映射/ JSON到POJO有关: 相片: 照片: JSON响应: LOGCAT 72行 问题答案: 您的课程不适合服务器 响应, 因此您的身体为 Null 。您的模型

  • 我尝试调用以下webclient查询: 谷歌返回的REST操作(https://developers.google.com/maps/documentation/geocoding/overview#GeocodingResponses)以下目标: 问题是我无法将其解析到我的类中:PlacesSearchResponse。班 我找不到任何错误和webClient是确定的,因为当我尝试体ToMono

  • 问题内容: 我正在以JSON格式传回来自网络服务器的批准推文列表。当我转到URL:时,在我的浏览器中得到以下JSON: 其ID为:。 当我从Javascript进行GET调用时,数字发生变化: 此代码提醒: 354210796420608004!= 354210796420608000 很奇怪。 问题答案: 不,不是很奇怪。JS将所有数字表示为双精度数字,并且随着整数的增大,您有时会失去精度。 要

  • 我试图获取一个JSON响应,并将结果存储在一个变量中。我在以前的Swift版本中使用过这个代码版本,直到Xcode8的GM版本发布。我在StackOverflow上看了几篇类似的文章:Swift 2 Parsing JSON-Cant下标类型为“anyObject”的值和Swift 3中的JSON Parsing。 然而,这里所传达的思想似乎不适用于这种情况。 如何正确解析Swift3中的JSON