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_valuehttps://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;
  }
}