Flutter 中的 Json 解析:List<dynamic> 不是 'Map<String,dynamic>' 类型的子类型

Posted

技术标签:

【中文标题】Flutter 中的 Json 解析:List<dynamic> 不是 \'Map<String,dynamic>\' 类型的子类型【英文标题】:Json Parsing in Flutter: List<dynamic > is not a subtype of type 'Map<String,dynamic>'Flutter 中的 Json 解析:List<dynamic> 不是 'Map<String,dynamic>' 类型的子类型 【发布时间】:2021-12-23 02:18:20 【问题描述】:

首先,我对使用 HTTP 请求和其他东西非常陌生。

我在 Java Spring 中创建了一个 API,并且我有一堆健身程序分配给一个用户,但是当我尝试从 Flutter 中的 JSON 获取对象时会出现此错误。我使用 http 并转换 dart 包。

List 不是类型 'Map

的子类型

问题出在这一行:

var userModel = Users.fromJson(jsonMap);

这是 getUsers 方法:

Future<Users> getUsers() async

    var client = http.Client();

    var userModel = null;


    
    var response = await client.get(Uri.parse(Strings.users_url));

    try 
      if (response.statusCode == 200) 
        var jsonString = response.body;
        var jsonMap = json.decode(jsonString);
        print(jsonMap);
        var userModel = Users.fromJson(jsonMap);

      
    
    catch(Exception) 
      print(Exception);
      return userModel;
    


    return userModel;
  

这些是用户和健身计划课程:

// To parse this JSON data, do
//
//     final users = usersFromJson(jsonString);

import 'dart:convert';

List<Users> usersFromJson(String str) => List<Users>.from(json.decode(str).map((x) => Users.fromJson(x)));

String usersToJson(List<Users> data) => json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class Users
  Users(
    this.id,
    this.email,
    this.password,
    this.firstName,
    this.lastName,
    this.birthday,
    this.weight,
    this.height,
    this.fitnessProgrammes,
  );

  int id;
  String email;
  String password;
  String firstName;
  String lastName;
  dynamic birthday;
  int weight;
  int height;
  List<FitnessProgramme> fitnessProgrammes;

  factory Users.fromJson(Map<String, dynamic> json) => Users(
    id: json["id"],
    email: json["email"],
    password: json["password"],
    firstName: json["firstName"],
    lastName: json["lastName"],
    birthday: json["birthday"],
    weight: json["weight"],
    height: json["height"],
    fitnessProgrammes: List<FitnessProgramme>.from(json["fitnessProgrammes"].map((x) => FitnessProgramme.fromJson(x))),
  );

  Map<String, dynamic> toJson() => 
    "id": id,
    "email": email,
    "password": password,
    "firstName": firstName,
    "lastName": lastName,
    "birthday": birthday,
    "weight": weight,
    "height": height,
    "fitnessProgrammes": List<dynamic>.from(fitnessProgrammes.map((x) => x.toJson())),
  ;


class FitnessProgramme 
  FitnessProgramme(
    this.id,
    this.name,
    this.trainingDifficulty,
  );

  int id;
  String name;
  String trainingDifficulty;

  factory FitnessProgramme.fromJson(Map<String, dynamic> json) => FitnessProgramme(
    id: json["id"],
    name: json["name"],
    trainingDifficulty: json["trainingDifficulty"],
  );

  Map<String, dynamic> toJson() => 
    "id": id,
    "name": name,
    "trainingDifficulty": trainingDifficulty,
  ;




【问题讨论】:

***.com/questions/51854891/…你检查过这个链接吗? 【参考方案1】:

您的 API 可能返回一组用户而不是单个用户。所以解码后的 JSON 类型是List&lt;Map&lt;String, dynamic&gt;&gt;。要解决这个问题,要么遍历每个用户并实例化他们,要么让你的 API 只返回一个特定的用户。

下面的代码可能会起作用并实例化 API 返回的第一个用户:

var userModel = Users.fromJson(jsonMap[0]);

【讨论】:

以上是关于Flutter 中的 Json 解析:List<dynamic> 不是 'Map<String,dynamic>' 类型的子类型的主要内容,如果未能解决你的问题,请参考以下文章

Flutter List.Builder 获取 JSON

Flutter 中的 JSON 数据解析

使用 Flutter 中的类解析 JSON 文件

Flutter 中的 JSON 解析和 Map

json - 如何在 flutter 中的List String中加入2 json值?

如何使用从 Flutter 中的 json 解析的嵌套映射列表中的函数创建对象