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?
Voici 2 façons courantes de se tromper:
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
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"]);
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
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,
),
);
Vous pouvez utiliser new Map<String, dynamic>.from(snapshot.value);
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()
);
}
}