将Json转换为包含对象列表的对象时出错

时间:2019-06-27 16:49:57

标签: json flutter dart fromjson

我收到了我从API请求中得到的响应,该响应已解码为JSON对象。当尝试将此Json对象转换为包含对象列表的类时,遇到以下错误:

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

我了解错误的含义,但无法找到解决方案。 Dart中有关此特定事物的资源非常有限。

我曾尝试重写fromJson方法几次,但一直遇到相同的错误。

下面是我的 UserList 类,我正在尝试将其转换为Json对象。

    class UserList {
      final List<UserObject> users;
      UserList({
        this.users,
      });

      addUser(UserObject user){
        users.add(user);
      }

      factory UserList.fromJson(List<dynamic> parsedJson) {
        List<UserObject> users = new List<UserObject>();
        users = parsedJson.map((i)=>UserObject.fromJson(i)).toList();

        return new UserList(
            users: users
        );
      }

      Map<String, dynamic> itemToJson() {
        return <String, dynamic>{
          'UserVal': this.users,
        };
      }

    }

这是我调用fromJson方法的地方:

    UserList list = UserList.fromJson(userVal);

userVal 等于:

{UserVal: [{UID: test, Email: test@gmail.com, Phone: 1110001111, Name: Test1}, {UID: test, Email: test@gmail.com, Phone: 1110001111, Name: Test2}, {UID: test, Email: test@gmail.com, Phone: 1110001111, Name: Test3}, {UID: test, Email: test, Phone: 1110001111, Name: test4}]}

我正在寻找的输出是拥有一个完整的对象,然后我的方法可以返回该对象并使用它。但是,此方法调用会中断。

1 个答案:

答案 0 :(得分:0)

您可以运行以下代码并尝试了解其工作方式,以了解为什么您的代码无法正常工作。

import 'dart:convert';

import 'json_objects.dart';

void main() {  
  var list = UserList.fromJson(userVal);
  for (var user in list.userVal) {
    print('Name: ${user.name}');
    print('Email: ${user.email}');
  }  
}

var userVal = {
  'UserVal': [
    {
      'UID': 'test',
      'Email': 'test@gmail.com',
      'Phone': '1110001111',
      'Name': 'Test1'
    },
    {
      'UID': 'test',
      'Email': 'test@gmail.com',
      'Phone': '1110001111',
      'Name': 'Test2'
    },
    {
      'UID': 'test',
      'Email': 'test@gmail.com',
      'Phone': '1110001111',
      'Name': 'Test3'
    },
    {'UID': 'test', 'Email': 'test', 'Phone': '1110001111', 'Name': 'test4'}
  ]
};

结果:

Name: Test1
Email: test@gmail.com
Name: Test2
Email: test@gmail.com
Name: Test3
Email: test@gmail.com
Name: test4
Email: test

JSON数据模型(由工具生成):

class User {
  final String email;
  final String name;
  final String phone;
  final String uID;

  User({this.email, this.name, this.phone, this.uID});

  factory User.fromJson(Map<String, dynamic> json) {
    return User(
      email: json['Email'] as String,
      name: json['Name'] as String,
      phone: json['Phone'] as String,
      uID: json['UID'] as String,
    );
  }

  Map<String, dynamic> toJson() {
    return {
      'Email': email,
      'Name': name,
      'Phone': phone,
      'UID': uID,
    };
  }
}

class UserList {
  final List<User> userVal;

  UserList({this.userVal});

  factory UserList.fromJson(Map<String, dynamic> json) {
    return UserList(
      userVal: _toObjectList(json['UserVal'], (e) => User.fromJson(e)),
    );
  }

  Map<String, dynamic> toJson() {
    return {
      'UserVal': _fromList(userVal, (e) => e.toJson()),
    };
  }
}

List _fromList(data, Function(dynamic) toJson) {
  if (data == null) {
    return null;
  }
  var result = [];
  for (var element in data) {
    var value;
    if (element != null) {
      value = toJson(element);
    }
    result.add(value);
  }
  return result;
}

List<T> _toObjectList<T>(data, T Function(Map<String, dynamic>) fromJson) {
  if (data == null) {
    return null;
  }
  var result = <T>[];
  for (var element in data) {
    T value;
    if (element != null) {
      value = fromJson(element as Map<String, dynamic>);
    }
    result.add(value);
  }
  return result;
}

/*
UserList:
  UserVal: List<User>

User:
  UID: String
  Email: String
  Phone: String
  Name: String
*/