我想在Flutter中从 JSON 序列化/反序列化对象。我知道我可以使用JsonDecoder
中的json.dart
给我基于字符串键的LinkedHashMap,但我对 ObjectMapper 方法更感兴趣,这样我才能够从反序列化中获取类型响应。
我尝试了使用Flutter的 redstone mapper (link)和可导出库(link) - 我都不知道能够正确编译。我相信这个问题与Dart的反射库有关。
如何使用Flutter实现一个有效的Object-Json Mapper?
示例代码:
class A {
@Field()
String b;
}
import 'package:redstone_mapper/mapper.dart';
import 'package:redstone_mapper/mapper_factory.dart';
bootstrapMapper();
var desObj = decodeJson(jsonString, A);
错误:
Starting device daemon...
Running lib/main.dart on Nexus 5X...
Dart snapshot generator failed with exit code 254
Errors encountered while loading: 'dart:mirrors': error: line 1 pos 1: unexpected token 'Unhandled'
或者这个:
Error detected in application source code:
error: Failed to load main script:
'package:redstone_mapper/mapper_factory.dart': error: line 4 pos 1: import of dart:mirrors with --enable-mirrors=false
import 'dart:mirrors';
答案 0 :(得分:5)
您尝试过的库存在的问题是它们使用的是dart:mirrors
,但Flutter不支持。
您应该尝试使用代码库的库,例如built_value
:https://github.com/google/built_value.dart
答案 1 :(得分:0)
@HarryTerkelsen建议Google提供 built_value 库。
可以找到序列化示例here。 缺点是 built_value 使用生成的 *。g.dart 类来创建序列化程序,因此这个库不是一个简单的“导入和运行”的东西。
有一个展示集合序列化的示例项目。 Collection和generated serializer。
简而言之 - 您需要运行this来生成序列化程序。
修改强>
最后,我最终从头开始编写简单的序列化:
import 'dart:convert';
class ItemDescription {
String tag;
String name;
static ItemDescription deserialize(String str) {
JsonDecoder decoder = new JsonDecoder();
var deserializedMap = decoder.convert(str);
return deserialize(deserializedMap);
}
static ItemDescription deserializeMap(Map map) {
ItemDescription description = new ItemDescription();
description.name = map["name"];
description.tag = map["symbol"];
return description;
}
}