json - 错误 : List is not a subtype of type

我目前正在构建一个应用程序来通过 api 读取数据,并且我正在尝试从 JSON Placeholder 解析 JSON api。

我为用户创建了一个模型类(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"]
    );
  }
}

这是将 json 读入小部件的 main.dart:

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}");
                  }
                })
          ],
        ),
      )
    );
  }
}

这是我试图读取的 JSON 信息,尽管它只是其中的一小部分:

{
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"
}
}

我目前遇到的错误是:

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

我该如何纠正这个错误?

最佳答案

API 返回 JSON 数组而不是 json 对象,因此是 List 而不是 Map。

即用户 json 是 Json Array 的第一个元素。

所以要获取第一个元素,请使用第一个索引。 内部获取信息更新

return Users.fromJson(jsonresponse[0]);

关于json - 错误 : List<dynamic> is not a subtype of type Map<String, 动态>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51854891/

相关文章:

json - 将 Firebase 中的数据序列化为 Flutter 的 Dart 对象的最佳方法是

dart - 使用 Flutter,如何在 iOS 上触发 TextField 的 onSubmit

dart - Flutter - 中心的 FloatingActionButton

flutter - 禁用 flutter 中的文本编辑字段

dart - 如何在 Flutter 中的 navigator.pop(context) 之后显示

dart - 如何在 flutter 中给出 "Dashed Border"?

android - Flutter:前台通知在 Firebase 消息传递中不起作用

flutter - 所有卡片的 TextField 值更改

flutter - SliverList 中的动画变化

dart - 如何使用 flutter 在按钮网格中滑动/拖动 2 个或更多按钮