【问题标题】:How to Map Model Class from JSON Response Flutter/MongoDB如何从 JSON 响应 Flutter/MongoDB 映射模型类
【发布时间】:2021-02-17 08:28:45
【问题描述】:

我已将Node/MongoDB 用于我的后端,并且在请求和响应方面一切正常。

对于我的前端,我正在使用flutter 构建一个移动应用程序,因此必须创建模型类来表示我的响应。 示例响应:

{success: true, message: Logged in Successfully, user: {_id: 6028965c16056b37eca50076, username: spideyr, email: peterparker@gmail.com, password: $2b$10$R4kYBA3Ezk7z2EBIY3dfk.6Qy.IXQuXJocKVS5PCzLf4fXYckUMju, phone: 89066060484, __v: 0}, accessToken: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE2MTM1NDg3ODIsImV4cCI6MTYxNjE0MDc4MiwiYXVkIjoiNjAyODk2NWMxNjA1NmIzN2VjYTUwMDc2IiwiaXNzIjoicGlja3VycGFnZS5jb20ifQ.DX8-WGRkCQ9geAaQASOIzoPGpvpjdI7aV0C5o1i5Thw, refreshToken: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE2MTM1NDg3ODIsImV4cCI6MTY0NTEwNjM4MiwiYXVkIjoiNjAyODk2NWMxNjA1NmIzN2VjYTUwMDc2IiwiaXNzIjoicGlja3VycGFnZS5jb20ifQ.RkVCGK9FfU0rxs2qf5QtJsyFaGShsL05CI320GsmAwg}

在这个响应正文中,我只对user 字段感兴趣,因此创建了我的POJO/PODO 类,如下所示:

class UserModel {

 final String id;
 final String username;
 final String email;
 final String phone;

  const UserModel({
    this.id,
     @required this.email,
     @required this.username,
     @required this.phone,
  });

  UserModel copyWith({String id, String username, String email, String phone}){
    if (
       (id == null) || identical(id, this.id) &&
       (username == null) || identical(id, this.username) &&
       (email == null || identical(email, this.email)) &&
       (phone == null || identical(phone, this.phone))) {
       return this;
    }

    return new UserModel(
       id: id ?? this.id,
       username: username ?? this.username,
       email: email ?? this.email,
       phone: phone ?? this.phone,
    );
 }

 static const empty = UserModel(email: '', username: null, phone: null, id: '');

 @override
 String toString() {
   return 'User{id: $id, username: $username, email: $email, phone: $phone}';
 }

 factory UserModel.fromMap(Map<String, dynamic> map){
    return new UserModel(
       id:map['_id'], // unable to understand why it shows error here
       username:map['username'],
       email:map['email'],
       phone:map['phone'],
    );
  }

  Map<String, dynamic> toMap(){
    return {
      'id': id,
       'username': username,
       'email': email,
       'phone': phone,
      };
    }

}

我可以登录并注册一个用户,但是这个错误一直出现在我的模型类 UserModel.fromJSON() 方法中我从 mongo db 的 _id to id 映射。这是错误:

I/flutter (19353): NoSuchMethodError: The method '[]' was called on null.
I/flutter (19353): Receiver: null
I/flutter (19353): Tried calling: []("_id")

有谁知道我需要对我的 UserModel 类进行哪些更改?谢谢。

【问题讨论】:

    标签: json mongodb flutter dart


    【解决方案1】:

    我将你的 JSON 转换为类

    class Model {
        Model({
            this.success,
            this.message,
            this.user,
            this.accessToken,
            this.refreshToken,
        });
    
        bool success;
        String message;
        User user;
        String accessToken;
        String refreshToken;
    
        factory Model.fromJson(Map<String, dynamic> json) => Model(
            success: json["success"],
            message: json["message"],
            user: User.fromJson(json["user"]),
            accessToken: json["accessToken"],
            refreshToken: json["refreshToken"],
        );
    
        Map<String, dynamic> toJson() => {
            "success": success,
            "message": message,
            "user": user.toJson(),
            "accessToken": accessToken,
            "refreshToken": refreshToken,
        };
    }
    
    class User {
        User({
            this.id,
            this.username,
            this.email,
            this.password,
            this.phone,
            this.v,
        });
    
        String id;
        String username;
        String email;
        String password;
        String phone;
        int v;
    
        factory User.fromJson(Map<String, dynamic> json) => User(
            id: json["_id"],
            username: json["username"],
            email: json["email"],
            password: json["password"],
            phone: json["phone"],
            v: json["__v"],
        );
    
        Map<String, dynamic> toJson() => {
            "_id": id,
            "username": username,
            "email": email,
            "password": password,
            "phone": phone,
            "__v": v,
        };
    }
    

    【讨论】:

    • 我喜欢你的回答,但仍然遇到同样的错误
    • 你能给我看看代码吗?所以我可以在最后尝试一下
    • 让我创建一个要点并与您分享,先生
    • 这是要点,抱歉在工作室中与身份验证作斗争,最终不得不在线进行 - gist.github.com/JosephIbe/f07bd96fda398bbfd0ea5a49fe8f087d
    • 谢谢你,但我要的是你正在处理的代码。你在哪里调用这个类。你在找我吗?
    【解决方案2】:

    感谢所有试图帮助我理解问题的人。我在 APIClient 类中缺少一个 return 语句,它确保我的映射中 fromJSON 方法中的所有值都是空的。

    这里是更正:

    class APIClient {
    
    dynamic post(String pathSegment, Map<String, dynamic> body) async {
      Dio dio = Dio();
      Response response = await dio.post(
        '${APIConstants.BASE_URL}${APIConstants.AUTH_URL}/$pathSegment',
        data: body
      );
      if(response.statusCode == 200) {
        print(response.data);
        return response.data; // here's the change
      } else {
         print(response.statusMessage);
         throw Exception(response.statusMessage);
        }
      }
    }
    

    【讨论】:

      【解决方案3】:

      问题出在UserResponseModel 类中。您将Map 分配给user

      试试这个:

      factory UserResponseModel.fromJSON(Map<String, dynamic> json) {
          return UserResponseModel(
            user: UserModel.fromJSON(json['user']),
            success: json['success'],
            message: json['message'],
            accessToken: json['accessToken'],
            refreshToken: json['refreshToken'],
          );
        }
      

      【讨论】:

      • 收到此错误尝试调用:[]("user")
      • 您的代码看起来不错。我猜你没有传递正确的地图(result.user)。你能分享请求数据并传递给 UserMode.fromMap 的代码吗?
      • 你是什么意思?
      • 您正在向 API 发出请求,获取 JSON,对其进行解码,然后传递给 UserModel.fromMap 对吗?你能分享那个代码吗?我怀疑您没有将正确的 Map 传递给 UserModel.fromMap
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 2021-08-29
      • 2021-02-13
      • 2018-06-19
      • 2018-11-07
      • 2014-08-04
      • 2020-09-13
      相关资源
      最近更新 更多