我收到了我从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}]}
我正在寻找的输出是拥有一个完整的对象,然后我的方法可以返回该对象并使用它。但是,此方法调用会中断。
答案 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
*/