我正在尝试获取和显示帖子,但是从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>
我需要将其声明为User而不是String,因为我需要在帖子中访问作者的信息(用户名,id等。)
有人对此有解决方案吗?
更新1: 我正在从Json Server获得“用户”引用,所以我必须将其称为“用户”,这样我才能引用“ 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: 这是我从author(它通过id指代作者)和id两者中获取的UUID。 顺便说一句,所以您知道它不是firebase,它是Django,所以我不能使用任何与firebase相关的代码。
[
{
"id": "3ab6e7c8-6a4c-42c2-a08d-e8a6c0fcdecb",
"author": "dbb0446d-d0ec-4c24-9c1e-8ca9b6b06a7d",
"caption": "caption here",
}
]
答案 0 :(得分:0)
您不能这样做,因为它仍然是地图!
例如,在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构造函数。