简体   繁体   English

Java Spring 引导消耗 API 嵌套 object 返回 NULL

[英]Java Spring Boot consuming API with nested object returns NULL

I'm playing around with spring boot trying to consume a third parties rest api.我正在玩 spring 引导,试图使用第三方 rest api。

The API call I'm using returns the below JSON object.我正在使用的 API 调用返回以下 JSON object。

{"success":true,"terms":"https:\/\/coinlayer.com\/terms","privacy":"https:\/\/coinlayer.com\/privacy","timestamp":1645616586,"target":"USD","rates":{"BTC":39049.424242}}

My code successfully consumes this JSON object however it returns this.我的代码成功使用了这个 JSON object 但是它返回了这个。

LiveData{success='true'terms='https://coinlayer.com/terms'privacy='https://coinlayer.com/privacy'timestamp='1645619886'target='EUR'rates={BTC='null'}}

Note that rates={BTC='null'} should be rates={BTC='39049.424242'}.请注意,rates={BTC='null'} 应该是 rates={BTC='39049.424242'}。 Any help is greatly appreciated.任何帮助是极大的赞赏。

Below is my code下面是我的代码

LiveData.java LiveData.java

package com.example.consumingrest;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public class LiveData {

    private Boolean success;
    private String terms;
    private String privacy;
    private Long timestamp;
    private String target;
    private Rates rates;

    public LiveData() {
    }

    public Boolean getSuccess() {
        return success;
    }

    public void setSuccess(Boolean success) {
        this.success = success;
    }

    public String getTerms() {
        return terms;
    }

    public void setTerms(String terms) {
        this.terms = terms;
    }

    public String getPrivacy() {
        return privacy;
    }

    public void setPrivacy(String privacy) {
        this.privacy = privacy;
    }

    public Long getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(Long timestamp) {
        this.timestamp = timestamp;
    }

    public String getTarget() {
        return target;
    }

    public void setTarget(String target) {
        this.target = target;
    }

    public Rates getRates() {
        return rates;
    }

    public void setValue(Rates rates) {
        this.rates = rates;
    }

    @Override
    public String toString() {
        return "LiveData{" +
                "success='" + success + '\'' +
                "terms='" + terms + '\'' +
                "privacy='" + privacy + '\'' +
                "timestamp='" + timestamp + '\'' +
                "target='" + target + '\'' +
                "rates=" + rates +
                '}';
    }
}

Rates.java费率.java

package com.example.consumingrest;
import java.math.BigDecimal;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public class Rates {

    private BigDecimal BTC;

    public Rates() {
    }

    public BigDecimal getBTC() {
        return this.BTC;
    }

    public void setId(BigDecimal BTC) {
        this.BTC = BTC;
    }


    @Override
    public String toString() {
        return "{" +
                "BTC='" + BTC + '\''+
                '}';
    }
}

ConsumingRest.java (main) ConsumingRest.java(主要)

package com.example.consumingrest;

import java.time.LocalDate;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
public class ConsumingRestApplication {

    private static final Logger log = LoggerFactory.getLogger(ConsumingRestApplication.class);

    public static void main(String[] args) {
        SpringApplication.run(ConsumingRestApplication.class, args);
    }

    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder.build();
    }

    @Bean
    public CommandLineRunner run(RestTemplate restTemplate) throws Exception {
        return args -> {
            LiveData liveData = restTemplate.getForObject(
                    "http://api.coinlayer.com/api/live?access_key=121a4df8b95fd5be872da3bad101cd73&target=EUR&symbols=BTC", LiveData.class);
            log.info(liveData.toString());
        };
    }
}

You can user @JsonProperty annotation.您可以使用 @JsonProperty 注释。

@JsonProperty(value = "BTC")
BigDecimal btc;

it is not camel case that is the reason it is null also some fields can be problematic as well.不是驼峰式大小写是它是 null 的原因,而且某些字段也可能有问题。 It is better to write annotation to those attributes which is problematic.最好为那些有问题的属性编写注释。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM