Ошибка преобразования Json в объект, который содержит список объектов
У меня есть ответ, который я получил от моего запроса 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 ответ
Вы можете запустить следующий код и попытаться понять, как он работает, чтобы понять, почему ваш код работает неправильно.
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'}
]
};
Результат:
Имя: Test1 Электронная почта: test@gmail.com Имя: Test2 Электронная почта: test@gmail.com Имя: Test3 Электронная почта: test@gmail.com Имя: test4 Электронная почта: тест
Модели данных 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
*/