Spring Boot Third part

Résolu
Bonjour,

Je désire consommer cette API ayant la structure suivante:
status 
timestamp "2021-03-29T00:43:52.606Z"
error_code 0
error_message null

data 
    0 
        id 1
        name "Bitcoin"
        symbol "BTC"
        slug "bitcoin"
        num_market_pairs 9508
        date_added "2013-04-28T00:00:00.000Z"
        tags 
            0 "mineable"
            1 "pow"
            2 "sha-256"
            3 "store-of-value"
            4 "state-channels"
            5 "coinbase-ventures-portfolio"
            6 "three-arrows-capital-portfolio"
            7 "polychain-capital-portfolio"
            8 "binance-labs-portfolio"
            9 "arrington-xrp-capital"
            10 "blockchain-capital-portfolio"
            11 "boostvc-portfolio"
            12 "cms-holdings-portfolio"
            13 "dcg-portfolio"
            14 "dragonfly-capital-portfolio"
            15 "electric-capital-portfolio"
            16 "fabric-ventures-portfolio"
            17 "framework-ventures"
            18 "galaxy-digital-portfolio"
            19 "huobi-capital"
            20 "alameda-research-portfolio"
            21 "a16z-portfolio"
            22 "1confirmation-portfolio"
            23 "winklevoss-capital"
            24 "usv-portfolio"
            25 "placeholder-ventures-portfolio"
            26 "pantera-capital-portfolio"
            27 "multicoin-capital-portfolio"
            28 "paradigm-xzy-screener"
        quote 
            USD 
                price 55904.82315827444
                volume_24h 47201562955.85
                percent_change_1h 0.5868173
                percent_change_24h -0.56976119

D'après le log d'erreurs il n'arrive pas à lire le tableau "tags" qui est lui meme contenu dans le tableau "data" d'indice 0.Je ne sais pas comment le corriger.J'ai besoin d'aide s'il vous plait
org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of `java.lang.String` out of START_ARRAY token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_ARRAY token
 at [Source: (PushbackInputStream); line: 1, column: 287] (through reference chain: com.cryptobackend.domain.Currency["data"]->java.util.ArrayList[0]->java.util.LinkedHashMap["tags"])] with root cause

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_ARRAY token
 at [Source: (PushbackInputStream); line: 1, column: 287] (through reference chain: com.cryptobackend.domain.Currency["data"]->java.util.ArrayList[0]->java.util.LinkedHashMap["tags"])
 at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59) ~[jackson-databind-2.11.4.jar:2.11.4]
 at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1468) ~[jackson-databind-2.11.4.jar:2.11.4]

//Entité
public class Currency {
    Map<String, String> status;

    List<Map<String,String>> data = 
      new ArrayList<Map<String,String>>();


 public Map<String, String> getStatus(){
  return status;
 }
 public void setStatus(Map<String, String> status) {
  this.status = status;
 }
 public List<Map<String, String>> getData(){
  return data;
 }
 public void setData(List<Map<String, String>> data) {
  this.data = data;
 } 
}

//Controleur
  @GetMapping("/currencies")
    public List<Currency> getCurrencies(){
      Currency currencies = restTemplate.getForObject(url, Currency.class);
     return Arrays.asList(currencies);
    }

1 réponse

  1. Modérateur
    Bonjour,

    Tu ne peux pas utiliser un parser JSON alors que ce que tu essaies de lire n'est pas du JSON...

    Le mieux que tu puisses faire c'est :
    String allDatas = restTemplate.getForObject(url, String.class);

    Ensuite il faut que tu traites manuellement le String pour extraire ce dont tu as besoin.