1
votes

Analyse JSON complexe dans Flutter

La liste des cartes que j'obtiens en réponse http

    final data = simpleBarArrayData;

ressemble à:

   print(simpleBarArrayData);

    [
     new OrdinalSales('27',30), 
     new OrdinalSales('28',68), 
     new OrdinalSales('29',73), 
     new OrdinalSales('30',60), 
     new OrdinalSales('31',57), 
     new OrdinalSales('01',51), 
     new OrdinalSales('02',51), 
     new OrdinalSales('03',51), 
     new OrdinalSales('04',48), 
     new OrdinalSales('05',58)
    ]

Ce que j'aimerais obtenir ce tableau json est une liste que je peux utiliser pour la bibliothèque Flutter Charting (Simple Bar Chart). Pour utiliser ce graphique à barres simple, ce tableau devrait ressembler à ceci:

    final data = [
      new OrdinalSales('27', 30),
      new OrdinalSales('28', 68),
      new OrdinalSales('29', 74),
      new OrdinalSales('30', 60),
      new OrdinalSales('31', 57),
      new OrdinalSales('01', 51),
      new OrdinalSales('02', 51),
      new OrdinalSales('03', 51),
      new OrdinalSales('04', 48),
      new OrdinalSales('05', 58),
    ];

Existe-t-il un moyen d'utiliser la liste existante de cartes pour créer le tableau json dont j'ai besoin afficher le graphique à barres simple?

MODIFIER:

J'ai réussi à créer un tableau (simpleBarArrayData) avec les données dont j'avais besoin pour le graphique à barres simple ( https://google.github.io/charts/flutter/example/bar_charts/simple ). Mais lorsque j'essaie d'insérer ce tableau au lieu du tableau défini comme exemple dans Simple Bar Chart, une erreur se produit:

    type 'List<dynamic>' is not a subtype of type List<OrdinalSales>' 

L'exemple de tableau de données:

     final data = [
          new OrdinalSales('27', 30),
          new OrdinalSales('28', 68),
          new OrdinalSales('29', 74),
          new OrdinalSales('30', 60),
          new OrdinalSales('31', 57),
          new OrdinalSales('01', 51),
          new OrdinalSales('02', 51),
          new OrdinalSales('03', 51),
          new OrdinalSales('04', 48),
          new OrdinalSales('05', 58),

];

Le tableau créé (simpleBarArrayData) ressemble à ceci:

   [
     {"date":"27\/08\/2019","score":"30.00"},
     {"date":"28\/08\/2019","score":"67.67"},
     {"date":"29\/08\/2019","score":"73.00"},
     {"date":"30\/08\/2019","score":"59.80"},
     {"date":"31\/08\/2019","score":"57.18"},
     {"date":"01\/09\/2019","score":"50.75"},
     {"date":"02\/09\/2019","score":"50.78"},
     {"date":"03\/09\/2019","score":"50.85"},
     {"date":"04\/09\/2019","score":"48.18"},
     {"date":"05\/09\/2019","score":"58.12"}
    ]

J'ai essayé de remplacer les données existantes par le code suivant:

    final List<dynamic> scoresByDay = httpResponse[0]['days']['averageScores'];    
    print(scoresByDay);

Et l'erreur se produit.


1 commentaires

Je ne sais pas pourquoi les réponses ne mentionnent pas la plus grande documentation , Il est facile d'utiliser un générateur au lieu d'un codage en dur personnalisé ...


3 Réponses :


0
votes

Disons que votre

List<String> dates = [];
List<int> scores = [];

void _fetch() {
  for (var item in json) {
    String date = item["date"];
    dates.add(date.split("\/")[0]);

    String score = item["score"];
    int element = int.parse(score.split("\.")[0]);
    scores.add(element);
  }
}

void _merge() {
  // you can merge by iterating it over
  List<OrdinalSales> data = [];
  for (int i = 0; i < dates.length; i++) {
    data.add(OrdinalSales(dates[i], scores[i]));
  }
}

Vous pouvez créer cette méthode, et ici les dates n'auront que vos dates et les scores auront un score.

List json = [YOUR_GIVEN_JSON_IN_LIST];


3 commentaires

Comment puis-je fusionner ces deux tableaux et obtenir une chaîne "new OrdinalSales ('27 ', 30)" incluse dans ce nouveau tableau?


Toujours sans la bonne solution au problème. J'ai édité la question en essayant de la résoudre.


OK, le correctif devrait être simple, au lieu d'utiliser List utilisez List .



0
votes

Étant donné un exemple de spécification OrdinalSales comme

List<dynamic> scoresByDay = [
     {"date":"27\/08\/2019","score":"30.00"},
     {"date":"28\/08\/2019","score":"67.67"},
     {"date":"29\/08\/2019","score":"73.00"},
     {"date":"30\/08\/2019","score":"59.80"},
     {"date":"31\/08\/2019","score":"57.18"},
     {"date":"01\/09\/2019","score":"50.75"},
     {"date":"02\/09\/2019","score":"50.78"},
     {"date":"03\/09\/2019","score":"50.85"},
     {"date":"04\/09\/2019","score":"48.18"},
     {"date":"05\/09\/2019","score":"58.12"}
    ];
// parse j with
var result = scoresByDay.map((i) => OrdinalSales.fromMap(i)).toList();
print(result[0].day); // 27
print(result[0].score); // 30

, vous pouvez l'utiliser comme

class OrdinalSales {
  String day;
  num score;

  OrdinalSales.fromMap(Map<String, dynamic>  m){
    day = m["date"].substring(0,2); // serious date parsing should be here
    score = num.parse(m["score"]).round();
  }
}


4 commentaires

J'obtiens cette erreur "le type 'List ' n'est pas un sous-type de type 'List '"


Où? (J'ai fait un petit refactor pour que le code soit plus compréhensible).


Je viens de modifier la question en essayant de résoudre le problème


Essayez d'utiliser data = new List.from (simpleBarArrayData); . Si data a été défini comme final , cela ne fonctionnera pas et vous devez soit supprimer le mot-clé final , soit créer une autre variable.