6
votes

Comment itérer JSON Map et récupérer les résultats clé-valeur dans Flutter Dart

Je travaille sur json en flutter flutter.

> symbols_returned,147 
>I/flutter ( 4575): base,USD 
>I/flutter ( 4575):
> data,{AED: 3.673050, AFN: 74.450000, ALL: 110.130000, AMD: 489.850000,
> ANG: 1.795100, AOA: 313.147500, ARS: 38.223700, AUD: 1.415500, AWG:
> 1.794500, AZN: 1.705000, BAM: 1.728800, BBD: 2.001800, BCH: 0.008256, BDT: 83.907000, BGN: 1.735350, BHD: 0.377050, BIF: 1830.000000, BMD:
> 1.000000, BND: 1.350750, BOB: 6.913550, BRL: 3.764500, BSD: 1.000100, BTC: 0.000278, BWP: 10.505000, BZD: 2.010200, CAD: 1.330845, CDF:
> 1630.000000, CHF: 1.004050, CLF: 0.025048, CLP: 662.775000, CNY: 6.792400, COP: 3134.400000, CRC: 611.915000, CUP: 1.000550, CVE: 97.511500, CZK: 22.949000, DJF: 177.720000, DKK: 6.618750, DOP: 50.580000, DZD: 118.915000, EGP: 17.586000, ETB: 28.600000, ETH: 0.008363, EUR: 0.886920, FJD: 2.134350, GBP: 0.777245, GEL: 2.645000, GHS: 5.225000, GIP: 0.769990, GMD: 49.545000, GNF: 9220.000000, GTQ:
> 7.755600, GYD: 209.510000, HKD: 7.847850, HNL: 24.500000, HRK: 6.569900, HTG: 82.551000, HUF: 283.885000, IDR: 14100.500000, ILS: 3.645750, INR: 71.165000, IQD: 1190.000000, IRR: 42105.000000 } }

Le premier est une chaîne, tandis que le second est un objet Map. Ma question est 1. comment parcourir et accéder à chaque devise dans Dart: par exemple. var currencyValue = stringJson ['AED']
Ce qui suit est ce que j'ai essayé StringJson et mapJson sont renvoyés par la future méthode jsonTest (). var stringJson = jsonOperation ()

                                 stringJson.then((onValue){
                                  if(onValue != null){
                                        onValue.forEach((k,v){  
                                       print(onValue['AED'])
                                        print('$k,$v');                                          
                                    });
                                  }
                                });

Le code ci-dessus renvoie: print (onValue ['AED']) imprimé nul tandis que print ('$ k, $ v'); imprimé ce qui suit:

    final response = http.get('url'). 
response.body returns this json String format: String stringJson = {"symbols_returned":147,"base":"USD","data":{"AED":"3.672940","AFN":"75.617000","ALL":"109.780000","AMD":"490.740000","ANG":"1.797350","AOA":"313.147500","ARS":"37.864500","AUD":"1.408450","AWG":"1.800000","AZN":"1.702500","BAM":"1.727050","BBD":"2.004250","BCH":"0.008196","BDT":"83.950500","BGN":"1.726900","BHD":"0.377470","BIF":"1800.000000","BMD":"1.000000","BND":"1.357650","BOB":"6.919100","BRL":"3.729400","BSD":"1.001300","BTC":"0.000278","BWP":"10.474000","BZD":"2.018350","CAD":"1.328050","CDF":"1631.000000","CHF":"1.000300","CLF":"0.025048","CLP":"658.100000","CNY":"6.746600","COP":"3121.850000","CRC":"612.970000","CUP":"1.001395","CVE":"97.373000","CZK":"22.793600","DJF":"177.720000","DKK":"6.589100","DOP":"50.646500","DZD":"118.840000","EGP":"17.609500","ETB":"28.413000","ETH":"0.008377","EUR":"0.883085","FJD":"2.125900","GBP":"0.773115","GEL":"2.645000","GHS":"5.276200","GIP":"0.770005","GMD":"49.550000","GNF":"9127.200000","GTQ":"7.765200","GYD":"209.360000","HKD":"7.846950","HNL":"24.439500"}
    }


    Map mapJson = json.decode(response.body) returns the following format: 
    {symbols_returned: 147, base: USD, data: {AED: 3.672940, AFN: 75.617000, ALL: 109.780000, AMD: 490.740000, ANG: 1.797350, AOA: 313.147500, ARS: 37.864500, AUD: 1.408450, AWG: 1.800000, AZN: 1.702500, BAM: 1.727050, BBD: 2.004250, BCH: 0.008196, BDT: 83.950500, BGN: 1.726900, BHD: 0.377470, BIF: 1800.000000, BMD: 1.000000, BND: 1.357650, BOB: 6.919100, BRL: 3.729400, BSD: 1.001300, BTC: 0.000278, BWP: 10.474000, BZD: 2.018350, CAD: 1.328050, CDF: 1631.000000, CHF: 1.000300, CLF: 0.025048, CLP: 658.100000, CNY: 6.746600, COP: 3121.850000, CRC: 612.970000, CUP: 1.001395, CVE: 97.373000, CZK: 22.793600, DJF: 177.720000, DKK: 6.589100, DOP: 50.646500, DZD: 118.840000, EGP: 17.609500, ETB: 28.413000, ETH: 0.008377, EUR: 0.883085, FJD: 2.125900, GBP: 0.773115, GEL: 2.645000, GHS: 5.276200, GIP: 0.770005, GMD: 49.550000, GNF: 9127.200000, GTQ: 7.765200, GYD: 209.360000, HKD: 7.846950, HNL: 24.439500, HRK: 6.537500, HTG: 82.810000, HUF: 281.363000, IDR: 14042.950000, ILS: 3.640660, INR: 71.165000, IQD: 1194.800000}}

Au lieu d'imprimer chaque devise au format clé / valeur. Le problème est que je ne peux pas accéder à chaque valeur de devise. Toute aide serait appréciée.


0 commentaires

3 Réponses :


2
votes

Je pense que vous itérez en fait l'objet parent, qui a une propriété data qui contient les valeurs. Vous devez itérer la propriété data.

Pour obtenir les valeurs, vous pouvez simplement utiliser:

  stringJson.then((onValue){
    if(onValue != null){
      onValue.data.forEach((k,v){  // add .data here
        print(onValue['AED'])
        print('$k,$v');                                          
      });
    }
  });


2 commentaires

Merci pour la réponse. L'éditeur IDE se plaint que onValue n'a pas de «données» comme méthode. L'expression d'erreur exacte est: "Les données getter ne sont pas définies pour la classe Map". veuillez noter que la méthode stringJson renvoie un objet Map. Encore merci


data n'est pas un champ, ni une clé dans la carte. onValue ['data'] vous rapprocherait.



4
votes

J'ai finalement pu accéder à chaque devise au format paire clé-valeur. puisque le format de la carte json est comme indiqué ci-dessous:

                              stringJson().then((onValue){ 
                              onValue['data'].forEach((k,v){                                      
                              //the following access AUD currency value
                              print(onValue['data']['AUD']);
                              //the following print all the currency in 
                              key-value format
                              print('$k,$v');                                     
                            });

j'ai utilisé print (onValue ['data'] ['AED']) qui renvoie 3.672940. où data (entre crochets) est le nom de la collection json et AED (également entre crochets) est la devise spécifique dont j'ai l'intention d'accéder. Pour parcourir la carte json, utilisez le code suivant:

 {symbols_returned: 147, base: USD, data: {AED: 3.672940, AFN: 75.617000, ALL: 109.780000, AMD: 490.740000, ANG: 1.797350, AOA: 313.147500, ARS: 37.864500, AUD: 1.408450, AWG: 1.800000, AZN: 1.702500, BAM: 1.727050, BBD: 2.004250, BCH: 0.008196, BDT: 83.950500, BGN: 1.726900, BHD: 0.377470, BIF: 1800.000000, BMD: 1.000000, BND: 1.357650, BOB: 6.919100, BRL: 3.729400, BSD: 1.001300, BTC: 0.000278, BWP: 10.474000, BZD: 2.018350, CAD: 1.328050, CDF: 1631.000000, CHF: 1.000300, CLF: 0.025048, CLP: 658.100000, CNY: 6.746600, COP: 3121.850000, CRC: 612.970000, CUP: 1.001395, CVE: 97.373000, CZK: 22.793600, DJF: 177.720000, DKK: 6.589100, DOP: 50.646500, DZD: 118.840000, EGP: 17.609500, ETB: 28.413000, ETH: 0.008377, EUR: 0.883085, FJD: 2.125900, GBP: 0.773115, GEL: 2.645000, GHS: 5.276200, GIP: 0.770005, GMD: 49.550000, GNF: 9127.200000, GTQ: 7.765200, GYD: 209.360000, HKD: 7.846950, HNL: 24.439500, HRK: 6.537500, HTG: 82.810000, HUF: 281.363000, IDR: 14042.950000, ILS: 3.640660, INR: 71.165000, IQD: 1194.800000}}

J'espère que cela aidera quelqu'un.


0 commentaires

9
votes

Convertissez la valeur décodée en Carte , puis vous pouvez accéder à la touche 'data' et la convertir également en Carte . Vous pouvez ensuite parcourir les clés de cette carte.

Future<void> printCurrencies() async {
  final response = await http.get('url');
  final decoded = jsonDecode(response) as Map;
  final data = decoded['data'] as Map;
  print(data['AED']); // prints 3.672940
  for (final name in data.keys) {
    final value = data[name];
    print('$name,$value'); // prints entries like "AED,3.672940"
  }
}

Notez que si vous voulez avoir une carte entièrement saisie, vous ne pouvez pas utiliser comme carte car à l'exécution, le type réifié est Map . Au lieu de cela, vous devrez utiliser la méthode cast . (decoded ['data'] as Map) .cast ();


1 commentaires

Cela a fonctionné, je ne sais pas pourquoi il n'a pas accepté votre réponse. Merci Nate.