web-dev-qa-db-fra.com

Exception non gérée: InternalLinkedHashMap <String, dynamic> 'n'est pas un sous-type de type' List <dynamic>

J'essaye d'obtenir la réponse JSON du serveur et de la produire sur la console.

Future<String> login() async {
    var response = await http.get(
        Uri.encodeFull("https://etrans.herokuapp.com/test/2"),
        headers: {"Accept": "application/json"});

    this.setState(() {
      data = json.decode(response.body);
    });


    print(data[0].name);
    return "Success!";
  }

Exception non gérée: le type "_InternalLinkedHashMap" n'est pas un sous-type du type "Liste

Quelle pourrait être la raison?

4
harunB10

Voici 2 façons courantes de se tromper:

  1. Si votre réponse est un objet json comme

    [
        {
          key1: value,
          key2: value,
        },
        {
          key1: value,
          key2: value,
        },
    
        .....
    ] 
    

    Ensuite, nous utilisons data [0] ["name"], not data [0] .name À moins que nous ne convertissions en un objet qui a la propriété name, nous ne pouvons pas utiliser données [0] .name

    Nous lions ceci data = json.decode(response.body).cast<ObjectName>();

    ObjectName peut être tout objet que vous souhaitez (intégré ou personnalisé). Mais assurez-vous qu'il a la propriété name

  2. Si votre réponse est un objet json comme

    {
        dataKey: [
          {
            key1: value1,
            key2: value2,
          } 
        ] 
    }
    

    Alors json.decode Renverra un Carte, pas un Liste

    Map<String, dynamic> map = json.decode(response.body);
    List<dynamic> data = data["dataKey"];
    print(data[0]["name"]);
    
3
Diyen Momjang

Vous pouvez obtenir cette erreur si vous utilisez retrofit.Dart et déclarez le mauvais type de retour pour vos méthodes annotées:

@GET("/search")
Future<List<SearchResults>> getResults(); 
// wrong! search results contains a List but the actual type returned by that endpoint is SearchResults 

contre

@GET("/search")
Future<SearchResults> getResults(); 
// correct for this endpoint - SearchResults is a composite with field for the list of the actual results
0
David Rawson

Vous devez convertir le runtimeType de data de _InternalLinkedHashMap à un List réel.

Une façon consiste à utiliser le List.from.

final _data = List<dynamic>.from(
  data.map<dynamic>(
    (dynamic item) => item,
  ),
);
0
jogboms

Vous pouvez utiliser new Map<String, dynamic>.from(snapshot.value);

Fonctionne parfaitement pour moi.

0
AKASH MATHWANI

Si vous avez besoin de travailler avec des champs génériques, il existe une solution:

class DicData
{
  int tot;
  List<Map<String, dynamic>> fields;

  DicData({
    this.tot,
    this.fields
  });

 factory DicData.fromJson(Map<String, dynamic> parsedJson) {
    return DicData(
        tot: parsedJson['tot'],
        //The magic....
        fields : parsedJson["fields"] = (parsedJson['fields'] as List)
            ?.map((e) => e == null ? null : Map<String, dynamic>.from(e))
            ?.toList()
    );
  }

}
0
Lucio Pelinson