代码之家  ›  专栏  ›  技术社区  ›  PeakGen

将JSON转换为模型时出错:类型“_InternalLinkedHashMap<dynamic,dynamic>”不是类型“String”的子类型

  •  1
  • PeakGen  · 技术社区  · 4 年前

    在我的Flutter代码中,我得到了以下JSON输入

    {chat_mode: supplier, 
     last_message: Hello World, 
      members: {one: {name: yohan, photo: https://com/google.jpg, uid: qwer}, 
      two: {name: gayan, photo: https://ih1.u1.jpg, uid: abcd}}}
    

    实际上,这是来自Firebase数据库的数据。如果我导出数据库,它看起来像这样

    "chat_room" : {
        "-MMbVLc0ucT4rck8zWGB" : {
          "chat_mode" : "supplier",
          "last_message" : "Hello World",
          "members" : {
            "one" : {
              "name" : "yohan",
              "photo" : "https://img-authors.flaticon.com/google.jpg",
              "uid" : "qwer"
            },
            "two" : {
              "name" : "gayan",
              "photo" : "https://ih1.redbubble.net/image.1057254628.1918/flat,750x,075,f-pad,750x1000,f8f8f8.u1.jpg",
              "uid" : "abcd"
            }
          }
        },
        "-MMbbviIhWjtXh5mwspG" : {
          "chat_mode" : "supplier",
          "last_message" : "Hello World",
          "members" : {
            "one" : {
              "name" : "yohan",
              "photo" : "https://img-authors.flaticon.com/google.jpg",
              "uid" : "K9ioYyiEUQVVNjx0owwsaZJzPph2"
            },
            "two" : {
              "name" : "gayan",
              "photo" : "https://ih1.redbubble.net/image.1057254628.1918/flat,750x,075,f-pad,750x1000,f8f8f8.u1.jpg",
              "uid" : "K9ioYyiEUQVVNjx0owwsaZJzPph2abcd"
            }
          }
        }
      }
    

    我正在使用 Models 因此,上述结构是由他们生成并保存在数据库中的。下面是模型

    聊天室模型

    import 'chat_member_model.dart';
    
    class ChatRoomModel {
        ChatRoomModel({
            this.chatMode,
            this.lastMessage,
            this.members,
            this.timestamp,
        });
    
        String chatMode;
        String lastMessage;
        Map<String, Member> members;
        int timestamp;
    
        factory ChatRoomModel.fromJson(Map<String, dynamic> json) => ChatRoomModel(
            chatMode: json["chat_mode"],
            lastMessage: json["last_message"],
            members: Map.from(json["members"]).map((k, v) => MapEntry<String, Member>(k, Member.fromJson(v))),
            timestamp: json["timestamp"],
        );
    
        Map<String, dynamic> toJson() => {
            "chat_mode": chatMode,
            "last_message": lastMessage,
            "members": Map.from(members).map((k, v) => MapEntry<String, dynamic>(k, v.toJson())),
            "timestamp": timestamp,
        };
    }
    

    会员

    class Member {
        Member({
            this.name,
            this.photo,
            this.uid
        });
    
        String name;
        String photo;
        String uid;
    
        factory Member.fromJson(Map<String, dynamic> json) => Member(
            name: json["name"],
            photo: json["photo"],
            uid: json["uid"],
        );
    
        Map<String, dynamic> toJson() => {
            "name": name,
            "photo": photo,
            "uid": uid,
        };
    }
    

    为了从服务器读取传入的JSON,我使用了 DataSnapshot 并尝试将其转换为Model。下面是代码。

    import 'dart:convert' as convert;
    
    print(snapshot.value);
    print("HERE WE GO!!");
    ChatRoomModel chatRoomModel = ChatRoomModel.fromJson(convert.json.decode(snapshot.value));
    

    不幸的是,这会触发以下错误,我无法执行转换。

    flutter: {chat_mode: supplier, last_message: Hello World, members: {one: {name: yohan, photo: https://img-authors.flaticon.com/google.jpg, uid: qwer}, two: {name: gayan, photo: https://ih1.redbubble.net/image.1057254628.1918/flat,750x,075,f-pad,750x1000,f8f8f8.u1.jpg, uid: abcd}}}
    flutter: HERE WE GO!!
    [VERBOSE-2:ui_dart_state.cc(177)] Unhandled Exception: type '_InternalLinkedHashMap<dynamic, dynamic>' is not a subtype of type 'String'
    

    我该如何解决这个问题?

    编辑

    我也试着跟随,但仍然不起作用

    ChatRoomModel chatRoomModel = ChatRoomModel.fromJson(snapshot.value);
    

    我得到这个错误

    Unhandled Exception: type '_InternalLinkedHashMap<dynamic, dynamic>' is not a subtype of type 'Map<String, dynamic>'
    
    0 回复  |  直到 4 年前
        1
  •  0
  •   hysunny    4 年前

    这是因为 snapshot.value 属于类型 地图 ,以及所需的参数类型 convert.json.decode 方法的类型为 字符串 .

    因此,当您调用convert.json.decode(snapshot.Value)时,将报告错误类型

    Unhandled Exception: type '_InternalLinkedHashMap<dynamic, dynamic>' is not a subtype of type 'String'
    

    你可以试着这样称呼它:

    ChatRoomModel chatRoomModel = ChatRoomModel.fromJson(Map<String, dynamic>.from(snapshot.value));