Flutter中的JSON ObjectMapper

时间:2016-11-29 23:23:27

标签: json dart jsonserializer objectmapper flutter

我想在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';

2 个答案:

答案 0 :(得分:5)

您尝试过的库存在的问题是它们使用的是dart:mirrors,但Flutter不支持。

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

答案 1 :(得分:0)

@HarryTerkelsen建议Google提供 built_value 库。

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

有一个展示集合序列化的示例项目。 Collectiongenerated 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;
  }
}