【问题标题】:Can't map second level json value with Spring Webflux Webclient无法使用 Spring Webflux Webclient 映射二级 json 值
【发布时间】:2019-06-09 16:33:14
【问题描述】:

我正在使用墨西哥的加密货币公共 API:https://api.bitso.com/v3/available_books/,它返回一个像这样的 json:

    "success": true,
    "payload": [
        {
            "book": "btc_mxn",
            "minimum_price": "500.00",
            "maximum_price": "16000000.00",
            "minimum_amount": "0.000075",
            "maximum_amount": "500.00000000",
            "minimum_value": "5",
            "maximum_value": "10000000.00"
        },
        {
            "book": "eth_btc",
            "minimum_price": "0.00000100",
            "maximum_price": "5000.00000000",
            "minimum_amount": "0.00000100",
            "maximum_amount": "1000.00000000",
            "minimum_value": "0.00000100",
            "maximum_value": "2000.00000000"
        },

使用 Webclient 使用它的代码是:

    @Override
    public Mono<Coins> getCoins() {
        return webClient.get().uri("https://api.bitso.com/v3/available_books/")
                .accept(MediaType.APPLICATION_JSON)
                .retrieve().bodyToMono(Coins.class);
    }

试图绑定它的 POJO 是:

@Data
public class Coins {

    @JsonProperty("success")
    private String success;

    @JsonProperty("playload")
    private List<Coin> playload;

@Data
public class Coin {

    @JsonProperty("book")
    private String book;

    @JsonProperty("minimum_amount")
    private String minimumAmount;

    @JsonProperty("maximum_amount")
    private String maximumAmount;

    @JsonProperty("minimum_price")
    private String minimumPrice;

    @JsonProperty("maximum_price")
    private String maximumPrice;

    @JsonProperty("minimum_value")
    private String minimumValue;

    @JsonProperty("maximum_value")
    private String maximumValue;

到目前为止,它只有这样的地图

"success": true,
"payload": null

【问题讨论】:

  • 更新:我将 Coins POJO 上的列表更改为 Flux,但响应相同

标签: java spring spring-boot spring-webflux spring-web


【解决方案1】:

修复:在属性名称 playload 而不是有效负载处出现错字

【讨论】:

    【解决方案2】:

    您需要有无参数构造并将单词 playload 更改为 payload :)

    【讨论】:

      【解决方案3】:

      我认为这不是 WebFlux 问题,而是 Jackson + Lombok 问题。 如果您尝试使用原始 ObjectMapper 反序列化该有效负载会发生什么?

      我认为 Jackson 需要一个带有 @JsonCreator 注释的全参数构造函数,或者要求 Lombok 为该类创建一个 @NoArgConstructor。无论如何,将 Coin 类重写为常规 Java 类应该可以工作。

      此外,您的 Coins 类有错字,因为它试图获取 playload 而不是 payload

      【讨论】:

      • 感谢您的反馈。我尝试了两种方式(不同的 Lombok 注释和普通 POJO,但没有区别)。
      猜你喜欢
      • 2018-05-09
      • 2018-08-18
      • 1970-01-01
      • 2020-01-30
      • 2017-12-31
      • 2021-08-06
      • 2019-12-28
      • 1970-01-01
      • 2019-01-03
      相关资源
      最近更新 更多