简体   繁体   中英

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.

The API call I'm using returns the below 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.

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'}. Any help is greatly appreciated.

Below is my code

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

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)

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(value = "BTC")
BigDecimal btc;

it is not camel case that is the reason it is null also some fields can be problematic as well. It is better to write annotation to those attributes which is problematic.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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