Error: List<dynamic> is not a subtype of type Map<String, dynamic>

匿名 (未验证) 提交于 2019-12-03 01:34:02

问题:

I am currently building an app to read data through an api and I am trying to parse a JSON api from JSON Placeholder.

I made a model class for the Users (users_future_model.dart):

class Users {   final int userID;   final String name;   final String username;   final String email;   final Address address;    Users({this.userID, this.name, this.username, this.email, this.address});    factory Users.fromJson(Map<String, dynamic> usersjson)=> Users(       userID: usersjson["id"],       name: usersjson["name"],       username: usersjson["username"],       email: usersjson["email"],       address: Address.fromJson(usersjson["address"])   ); }  class Address{    final String street;   final String suite;   final String city;   final String zipcode;    Address({this.street, this.suite, this.city, this.zipcode});    factory Address.fromJson(Map<String, dynamic> addjson){      return Address(       street: addjson["street"],       suite:  addjson["suite"],       city: addjson["city"],       zipcode: addjson["zipcode"]     );   } } 

This is the main.dart to read the json into the widget:

import 'package:flutter/material.dart'; import 'model/users_future_model.dart'; import 'dart:convert'; import 'dart:async'; import 'package:http/http.dart' as http;  final String jsonplaceholder = "http://jsonplaceholder.typicode.com/users/";  //Future method to read the URL Future<Users> fetchInfo() async{   final response = await http.get(jsonplaceholder);   final jsonresponse = json.decode(response.body);    return Users.fromJson(jsonresponse); }  void main() {   runApp(new MyApp()); }  class MyApp extends StatelessWidget {   @override   Widget build(BuildContext context) {     return new MaterialApp(       home: new MyHomePage(),     );   } }  class MyHomePage extends StatefulWidget {   @override   _MyHomePageState createState() => new _MyHomePageState(); }  class _MyHomePageState extends State<MyHomePage> {    @override   Widget build(BuildContext context) {     return new Scaffold(       appBar: new AppBar(         title: new Text("Parse JSON"),       ),       body: new Center(         child: new Column(           children: <Widget>[             new FutureBuilder(                 future: fetchInfo(),                 builder: (context, snapshot){                   if(snapshot.hasData){                     return new Text(snapshot.data.email);                   }else if(snapshot.hasError){                     return new Text("Error ${snapshot.error}");                   }                 })           ],         ),       )     );   } } 

This is the JSON information i'm trying to read although its only a small part of it:

{ id: 1, name: "Leanne Graham", username: "Bret", email: "Sincere@april.biz", address: {  street: "Kulas Light",  suite: "Apt. 556",  city: "Gwenborough",  zipcode: "92998-3874",  geo: {   lat: "-37.3159",   lng: "81.1496"  } }, phone: "1-770-736-8031 x56442", website: "hildegard.org", company: {  name: "Romaguera-Crona",  catchPhrase: "Multi-layered client-server neural-net",  bs: "harness real-time e-markets" } } 

The error i am currently running into is:

Error type 'List<dynamic>' is not a subtype of type 'Map<String, dynamic>' 

How do i rectify this error?

回答1:

API returns JSON array not json object so that is List not Map.

i.e. User json is first element of Json Array.

So to get first element use first index. Inside fetch Info update

return Users.fromJson(jsonresponse[0]);



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!