无法使用Spring Webflux Webclient映射第二级json值

时间:2019-01-15 16:09:31

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

我正在墨西哥使用加密货币的公共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

3 个答案:

答案 0 :(得分:0)

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

我认为Jackson要求使用所有带有@JsonCreator注释的args构造函数,或者要求Lombok为该类创建一个@NoArgConstructor。在任何情况下,都可以将Coin类重写为常规Java类。

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

答案 1 :(得分:0)

您需要使用no-args构造,并将单词playload更改为payload:)

答案 2 :(得分:0)

已修复:在属性名称playload而不是有效载荷上输入错字