我正在尝试获取并显示帖子,但是在从json中提取数据时,我得到了一个错误。
模型
class Post {
final String id;
final User author;
final String caption;
Post({this.id,this.author, this.caption, }
);
factory Post.fromJSON(Map<String, dynamic> jsonMap) {
return Post(
id: jsonMap['id'] as String,
caption: jsonMap['caption'] as String,
author: jsonMap['author'] as User,
);
}
Map toMap(Post post) {
var map = new Map<String, dynamic>();
map["id"] = post.id;
map["caption"] = post.caption;
map["author"] = post.author;
return map;
}
Map<String, dynamic> toJson() => {
'id' : id,
'author' :author,
'caption' :caption,
};
String rawJson = jsonEncode(Map);
@override
String toString() {
var map = this.toMap(Post());
map["post"] = Post();
return map.toString();
}
}我试着用
final String author;而不是以前的版本
但当我尝试的时候它也给了我
Converting object to an encodable object failed: Map<dynamic, dynamic>我需要将它声明为用户而不是字符串,因为我需要访问作者的信息(用户名、id等)。在岗位上
有谁能解决这个问题吗?
更新1:我从Json获得了一个“用户”引用,所以我必须将它称为用户,这样我就可以引用"User.email“之类的东西。我已经这样声明了用户
class User {
final String id;
final String email;
final String username;
User({
this.id,this.email,this.username,
});
factory User.fromJSON(Map<String, dynamic> json) {
return User(
id: json['id'] as String,
email: json['email'] as String,
username: json['username'] as String,
);
}
Map<String, dynamic> toJson() => {
'id' : id,
'email' : email,
'username' : username,
};
Map toMap(User user) {
var map = new Map<String, dynamic>();
map["id"] = user.id;
map["email"] = user.email;
map["username"] = user.username ;
return map;
}
@override
String toString() {
var map = this.toMap(User());
map["user"] = User();
return map.toString();
}
}更新2:
Future<List<Post>> fetchPosts(http.Client client) async {
final response = await http.get("$SERVER_IP/api/articles/?format=json");
return compute(parsePosts, response.body);
}
List<Post> parsePosts(String responseBody) {
final parsed = jsonDecode(responseBody).cast<Map<String, dynamic>>();
return parsed.map<Post>((json) => Post.fromJSON(json)).toList();
}更新3:这是一个UUID,我从author (它通过id引用作者)和id获得。顺便说一下,您知道它不是firebase,而是Django,所以我不能使用任何与firebase相关的代码。
[
{
"id": "3ab6e7c8-6a4c-42c2-a08d-e8a6c0fcdecb",
"author": "dbb0446d-d0ec-4c24-9c1e-8ca9b6b06a7d",
"caption": "caption here",
}
]发布于 2020-08-19 15:33:22
你不能那样做,因为它仍然是一张地图!
例如,在User类中,解决这个问题的方法是:(我已经组成了属性!):
class User {
String name;
String lastName;
const User({
this.name,
this.lastName,
});
factory User.fromJson(Map<String, dynamic> json) {
return User(
name: json['name'],
lastName: json['lastName'],
);
}
}这里使用的是factory构造函数(再次),但现在我们正在将json数据(或映射)解析为User。然后,在Post JSON构造函数中,您必须使用User JSON构造函数。
https://stackoverflow.com/questions/63490332
复制相似问题