0

我想在 Flutter 中从JSON序列化/反序列化对象。我知道我可以使用from which 给我基于字符串键的 LinkedHashMap 但我对ObjectMapper方法更感兴趣,以便我能够从反序列化中获得类型化的响应。JsonDecoderjson.dart

我用 Flutter 尝试了redstone mapper ( link ) 和可导出库( link ) - 这两者我都无法正确编译。我相信这个问题与 Dart 的反射库有关。

如何使用 Flutter 实现有效的 Object-Json 映射器?

示例代码:

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';
4

2 回答 2

5

您尝试的库的问题是它们使用dart:mirrors了 Flutter 不支持的库。

您应该尝试使用 codegen 的库,例如built_valuehttps ://github.com/google/built_value.dart

于 2016-11-30T00:00:54.077 回答
0

正如@HarryTerkelsen 建议的那样,Google 有built_value库。

序列化示例可以在这里找到。缺点是built_value使用生成的*.g.dart类来创建序列化程序,所以这个库不是一个简单的“导入和运行”的东西。

有一个示例项目展示了集合序列化。集合生成的序列化程序

简而言之 - 您需要运行来生成您的序列化程序。

编辑:

最后,我最终从头开始编写简单的序列化:

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;
  }
}
于 2016-12-20T21:03:26.450 回答