wal*_*ker 1 dart json-deserialization flutter
我的模型:
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._();
}
Run Code Online (Sandbox Code Playgroud)
我的要求:
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');
}
}
Run Code Online (Sandbox Code Playgroud)
以及源代码中的断点:
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) {
//...
}
Run Code Online (Sandbox Code Playgroud)
错误:
发生异常。将“{userId:1,id:3,标题:eamolestiasquasiexeritationemrepellatquiipsa...”反序列化为“Post”失败,因为:类型“_InternalLinkedHashMap”不是类型转换中“Iterable”类型的子类型
我的问题是我的类型定义或反序列化用法有误,并且我在response.body(a Map) 中得到了一个对象,为什么代码执行 atas Iterable而不是PrimitiveSerializer指令。
关键是StandardJsonPlugin。
我从官方示例中复制了serializers.dart文件:
@SerializersFor(const [
Account,
Cat,
CompoundValue,
Fish,
GenericValue,
SimpleValue,
VerySimpleValue,
])
final Serializers serializers = _$serializers; // see this line
Run Code Online (Sandbox Code Playgroud)
但是当我在网络中查找时,人们使用这个:
final Serializers serializers =
(
_$serializers.toBuilder()
..addPlugin(StandardJsonPlugin())
).build();
Run Code Online (Sandbox Code Playgroud)
当我添加StandardJsonPlugin.
| 归档时间: |
|
| 查看次数: |
2341 次 |
| 最近记录: |