我的模特:
abstract class Post implements Built<Post, PostBuilder> {
static Serializer<Post> get serializer => _$postSerializer;
int get userId;
int get id;
String get title;
String get body;
factory Post([updates(PostBuilder b)]) = _$Post;
Post._();
}
我的要求:
Future<Post> getPostById(int id) async {
final resp = await http.get('https://jsonplaceholder.typicode.com/posts/${id}');
if(resp.statusCode == 200) {
return serializers.deserializeWith(Post.serializer, json.decode(resp.body));
}else {
throw Exception('Failed to load post');
}
}
和源代码中的断点位于:
if (serializer is StructuredSerializer) {
try {
// ===> HERE
return serializer.deserialize(this, object as Iterable,
specifiedType: specifiedType);
} on Error catch (error) {
throw new DeserializationError(object, specifiedType, error);
}
}else if(serializer is PrimitiveSerializer) {
//...
}
错误:
发生异常。 将'{userId:1,id:3,标题:ea quisti exercitationem repellat qui ipsa ...'反序列化为'Post'失败,原因是:类型_InternalLinkedHashMap在类型转换中不是'Iterable'类型的子类型>
我的问题是我在类型定义或反序列化用法上错了,并且我在response.body(a Map)中得到一个对象,为什么代码在as Iterable
而不是{{1 }}指令。
答案 0 :(得分:0)
密钥是StandardJsonPlugin
。
我从官方example复制了serializers.dart文件:
@SerializersFor(const [
Account,
Cat,
CompoundValue,
Fish,
GenericValue,
SimpleValue,
VerySimpleValue,
])
final Serializers serializers = _$serializers; // see this line
但是当我在网络中查询时,人们会使用它:
final Serializers serializers =
(
_$serializers.toBuilder()
..addPlugin(StandardJsonPlugin())
).build();
并确保当我添加StandardJsonPlugin
时它也对我有用。