JSON Flutter 中的 ObjectMapper
JSON ObjectMapper in Flutter
我想在 Flutter 中从 JSON 获得 objects serialized/deserialized。我知道我可以使用 json.dart
中的 JsonDecoder
,它为我提供了基于字符串键的 LinkedHashMap,但我对 ObjectMapper 方法更感兴趣,因此我能够从反序列化中获得 typed 响应。
我用 Flutter 尝试了 redstone mapper (link) and exportable library (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';
您尝试的库的问题是它们使用 dart:mirrors
,Flutter 不支持它。
您应该尝试使用 codegen 的库,例如 built_value
:https://github.com/google/built_value.dart
正如@HarryTerkelsen 所建议的,built_value 库来自 Google。
可以找到序列化示例here。
缺点是 built_value 使用生成的 *.g.dart 类 来创建序列化器,所以这个库是不是简单的 "import & run" 事情。
有一个展示集合序列化的示例项目。 Collection and the 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;
}
}
我想在 Flutter 中从 JSON 获得 objects serialized/deserialized。我知道我可以使用 json.dart
中的 JsonDecoder
,它为我提供了基于字符串键的 LinkedHashMap,但我对 ObjectMapper 方法更感兴趣,因此我能够从反序列化中获得 typed 响应。
我用 Flutter 尝试了 redstone mapper (link) and exportable library (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';
您尝试的库的问题是它们使用 dart:mirrors
,Flutter 不支持它。
您应该尝试使用 codegen 的库,例如 built_value
:https://github.com/google/built_value.dart
正如@HarryTerkelsen 所建议的,built_value 库来自 Google。
可以找到序列化示例here。 缺点是 built_value 使用生成的 *.g.dart 类 来创建序列化器,所以这个库是不是简单的 "import & run" 事情。
有一个展示集合序列化的示例项目。 Collection and the 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;
}
}