假设我有以下json(结构为<字符串键,映射值>(:
{
'A1': {'name': 'a'},
'B2': {'name': 'b'}
}
并且我想要使用fromJson工厂方法将其解析为这个类(注意我使用密钥作为该用户的id(,该方法接受两个参数:
Class User {
final String id;
final String name;
factory User.fromJson(Map<String, dynamic> json, String key) {
return User(
id: key,
name: json['name'],
);
}
}
我可以使用json_serializable实现它吗?
此工厂方法所期望的json
映射只是您正在解析的顶级JSON对象的值。
您所需要做的就是解析JSON,提取所有键,然后将值传递给工厂方法。
类似这样的东西:
import 'dart:convert';
const json = '''
{
"A1": {"name": "a"},
"B2": {"name": "b"}
}
''';
class User {
final String id;
final String name;
User({required this.id, required this.name});
factory User.fromJson(Map<String, dynamic> json, String key) {
return User(
id: key,
name: json['name'],
);
}
@override
String toString() => 'User(id=$id, name=$name)';
}
main() {
final map = jsonDecode(json);
map.forEach((id, userJson) {
final user = User.fromJson(userJson, id);
print(user);
});
}
打印:
User(id=A1, name=a)
User(id=B2, name=b)
现在,要使用json_serializable,只需对其进行注释,并用生成的实现替换您的实现。。。
@JsonSerializable()
class User {
...
factory User.fromJson(Map<String, dynamic> json, String key) =>
// pass in only the relevant json Map!
_$UserFromJson(json[key]);
}