type '_InternalLinkedHashMap<String, dynamic>' 不是 type 'String' JSON 映射到模型的子类型

type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'String' JSON Mapinng into model

大家好,我正在尝试从 API 获取 JSON,但是在将 JSON 映射到我创建的模型中时出现此错误,类型为 [=16] =]

这是 JSON 响应

{"data":{"userinfo":[{"firstname":"MAEN","lastname":"NASSAN","email":"maen.alnassan@outlook.com","active_status":0,"dark_mode":0,"messenger_color":"#2180f3","avatar":"avatar.png","gender":"male","region":"Turkey","birthyear":"2021","birthday":"1","birthmonth":"January","phonenumber":53105311,"category":"0","profilestatus":"private","ban":"0","banReason":"0","banDurationByDays":"0","email_verified_at":null,"created_at":"2021-05-24T16:27:52.000000Z","updated_at":"2021-05-24T16:27:52.000000Z"}],"userfriendsPosts":[{"postid":1,"userid":3,"posttitle":"Post 1 mohamed","post":"noattachment","likesCounter":0,"commentsCounter":0,"category":"0","created_at":"2021-05-22T20:49:48.000000Z","updated_at":"2021-05-22T20:49:48.000000Z"},{"postid":3,"userid":3,"posttitle":"Post 2 mohamed","post":"noattachment","likesCounter":0,"commentsCounter":0,"category":"0","created_at":"2021-05-22T20:58:40.000000Z","updated_at":"2021-05-22T20:58:40.000000Z"},{"postid":4,"userid":3,"posttitle":"Post 3 mohamed","post":"noattachment","likesCounter":0,"commentsCounter":0,"category":"0","created_at":"2021-05-22T20:58:43.000000Z","updated_at":"2021-05-22T20:58:43.000000Z"}],"usernotifications":[],"userlikes":[]}}

这是模型 Class

import 'dart:convert';

Data dataFromJson(String str) => Data.fromJson(json.decode(str));

String dataToJson(Data data) => json.encode(data.toJson());

class Data {
    Data({
        this.data,
    });

    DataClass data;

    factory Data.fromJson(Map<String, dynamic> json) => Data(
        data: DataClass.fromJson(json["data"]),
    );

    Map<String, dynamic> toJson() => {
        "data": data.toJson(),
    };
}

class DataClass {
    DataClass({
        this.userinfo,
        this.userfriendsPosts,
        this.usernotifications,
        this.userlikes,
    });

    List<Userinfo> userinfo;
    List<UserfriendsPost> userfriendsPosts;
    List<dynamic> usernotifications;
    List<dynamic> userlikes;

    factory DataClass.fromJson(Map<String, dynamic> json) => DataClass(
        userinfo: List<Userinfo>.from(json["userinfo"].map((x) => Userinfo.fromJson(x))),
        userfriendsPosts: List<UserfriendsPost>.from(json["userfriendsPosts"].map((x) => UserfriendsPost.fromJson(x))),
        usernotifications: List<dynamic>.from(json["usernotifications"].map((x) => x)),
        userlikes: List<dynamic>.from(json["userlikes"].map((x) => x)),
    );

    Map<String, dynamic> toJson() => {
        "userinfo": List<dynamic>.from(userinfo.map((x) => x.toJson())),
        "userfriendsPosts": List<dynamic>.from(userfriendsPosts.map((x) => x.toJson())),
        "usernotifications": List<dynamic>.from(usernotifications.map((x) => x)),
        "userlikes": List<dynamic>.from(userlikes.map((x) => x)),
    };
}

class UserfriendsPost {
    UserfriendsPost({
        this.postid,
        this.userid,
        this.posttitle,
        this.post,
        this.likesCounter,
        this.commentsCounter,
        this.category,
        this.createdAt,
        this.updatedAt,
    });

    int postid;
    int userid;
    String posttitle;
    String post;
    int likesCounter;
    int commentsCounter;
    String category;
    DateTime createdAt;
    DateTime updatedAt;

    factory UserfriendsPost.fromJson(Map<String, dynamic> json) => UserfriendsPost(
        postid: json["postid"],
        userid: json["userid"],
        posttitle: json["posttitle"],
        post: json["post"],
        likesCounter: json["likesCounter"],
        commentsCounter: json["commentsCounter"],
        category: json["category"],
        createdAt: DateTime.parse(json["created_at"]),
        updatedAt: DateTime.parse(json["updated_at"]),
    );

    Map<String, dynamic> toJson() => {
        "postid": postid,
        "userid": userid,
        "posttitle": posttitle,
        "post": post,
        "likesCounter": likesCounter,
        "commentsCounter": commentsCounter,
        "category": category,
        "created_at": createdAt.toIso8601String(),
        "updated_at": updatedAt.toIso8601String(),
    };
}

class Userinfo {
    Userinfo({
        this.firstname,
        this.lastname,
        this.email,
        this.activeStatus,
        this.darkMode,
        this.messengerColor,
        this.avatar,
        this.gender,
        this.region,
        this.birthyear,
        this.birthday,
        this.birthmonth,
        this.phonenumber,
        this.category,
        this.profilestatus,
        this.ban,
        this.banReason,
        this.banDurationByDays,
        this.emailVerifiedAt,
        this.createdAt,
        this.updatedAt,
    });

    String firstname;
    String lastname;
    String email;
    int activeStatus;
    int darkMode;
    String messengerColor;
    String avatar;
    String gender;
    String region;
    String birthyear;
    String birthday;
    String birthmonth;
    int phonenumber;
    String category;
    String profilestatus;
    String ban;
    String banReason;
    String banDurationByDays;
    dynamic emailVerifiedAt;
    DateTime createdAt;
    DateTime updatedAt;

    factory Userinfo.fromJson(Map<String, dynamic> json) => Userinfo(
        firstname: json["firstname"],
        lastname: json["lastname"],
        email: json["email"],
        activeStatus: json["active_status"],
        darkMode: json["dark_mode"],
        messengerColor: json["messenger_color"],
        avatar: json["avatar"],
        gender: json["gender"],
        region: json["region"],
        birthyear: json["birthyear"],
        birthday: json["birthday"],
        birthmonth: json["birthmonth"],
        phonenumber: json["phonenumber"],
        category: json["category"],
        profilestatus: json["profilestatus"],
        ban: json["ban"],
        banReason: json["banReason"],
        banDurationByDays: json["banDurationByDays"],
        emailVerifiedAt: json["email_verified_at"],
        createdAt: DateTime.parse(json["created_at"]),
        updatedAt: DateTime.parse(json["updated_at"]),
    );

    Map<String, dynamic> toJson() => {
        "firstname": firstname,
        "lastname": lastname,
        "email": email,
        "active_status": activeStatus,
        "dark_mode": darkMode,
        "messenger_color": messengerColor,
        "avatar": avatar,
        "gender": gender,
        "region": region,
        "birthyear": birthyear,
        "birthday": birthday,
        "birthmonth": birthmonth,
        "phonenumber": phonenumber,
        "category": category,
        "profilestatus": profilestatus,
        "ban": ban,
        "banReason": banReason,
        "banDurationByDays": banDurationByDays,
        "email_verified_at": emailVerifiedAt,
        "created_at": createdAt.toIso8601String(),
        "updated_at": updatedAt.toIso8601String(),
    };
}

这是API请求函数

static Future<List<Data>> getData(token) async{
    Dio dio = new Dio();
    dio.options.headers["Authorization"] = "bearer $token";
    dio.options.headers["Content-Type"] = 'application/json';
    dio.options.headers["Accept"] = 'application/json';
    await dio.get(url,).then((response) {
      final List<Data> _data = dataFromJson(response.data) as List<Data>;
      return _data;
    }
    ).catchError((error) => print(error));
  }

我尝试了所有方法来获取数据和复杂的 JSON 列表,但它总是以错误结尾,看起来像这样的错误

你得到的错误是告诉你:“你的代码需要一个 String,但你给了它一个 _InternalLinkedHashMap<String, dynamic>(即 Map<String, dynamic>)”。

不清楚错误发生在哪里,但我的猜测是 response.data 是一个 Map<String, dynamic>,但 dataFromJson 期望一个 String,而这一行是导致错误。

如果您查看 Dio.get() (https://pub.dev/documentation/dio/latest/dio/Dio/get.html) 的文档, 你可以看到签名是:

Future<Response<T>> get<T>(String path, { ... });

当您在不传递类型参数的情况下调用 dio.get(url) 时,它默认为 dynamic,这实际上关闭了类型检查。如果你希望你的 api 变成 return 一个 String,你可以通过使用 dio.get<String>(url).

将它提供给 dio

但是,如果您要立即 jsonDecode 它,您可以修改 dataFromJson 以接受 Map<String, dynamic> 而不是 String,并跳过 jsonDecode步.

最后,我建议您查看 json 库(json_serializable 非常容易上手)。手写 json 序列化代码重复且容易出错。您无需手动编写 toJson()fromJson() 函数,只需定义存根,即可在编译时生成序列化代码。 https://pub.dev/packages/json_serializable