【问题标题】:Serialize Dart Map序列化飞镖地图
【发布时间】:2020-12-27 18:21:13
【问题描述】:

在 dart 中解组这个 json 的最佳方法是什么:

{
"Ace-spades-2": {
    "rank": { "shortName": "A", "longName": "Ace" },
    "suit": { "name": "spades" },
    "id": "Ace-spades-2"
},
"Two-spades-2": {
    "rank": { "shortName": "2", "longName": "Two" },
    "suit": { "name": "spades" },
    "id": "Two-spades-2"
},
"Three-spades-2": {
    "rank": { "shortName": "3", "longName": "Three" },
    "suit": { "name": "spades" },
    "id": "Three-spades-2"
},
{....a bunch more cards}

}

这是我想要解组的类。具体来说,我想制作数据 Map。我该怎么做?

class Card {
  Rank rank;
  Suit suit;
  String id;
  Card({this.rank,this.suit,this.id})
}

class Rank {
  String shortName;
  String longName;
  Rank({this.shortName, this.longName});
}

class Suit {
  String name;
  Suit({this.name});
}

在 Go 中,我会做 卡片 := 地图[字符串]卡片{} json.Unmarshal(, &cards).

在 dart 中最好的方法是什么?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    对于 Flutter 中的序列化(反射不可用),使用 json_serializable 包非常常见。关于这个包的一个很好的教程也在颤振文档中:https://flutter.dev/docs/development/data-and-backend/json#serializing-json-using-code-generation-libraries

    当你注释了你的类(并且你已经完成了其他的安装说明——还要记住library 声明中的注释,这是强制性的),你可以利用Card.fromJson() 工厂构造函数。您可以使用jsonDecode() 函数(属于dart:convert 包)在Map<String, dynamic> 中转换您的json 原始字符串,然后在地图上迭代并使用Card.fromJson 转换地图中的每个条目。 例如:

    Map<String, Card> cardMap = (jsonDecode(jsonString) as Map<String, dynamic>).map((key, cardString) => MapEntry(key, Card.fromJson(cardString)));
    

    一个非常重要的注意事项:当您有一个类(在您的示例中为 Card 和 Rank),其字段类型不是原始类型,而是表示另一个使用 JsonSerializable 注释的类时,JsonSerializable 注释必须通过 explicitToJson: true (即@ 987654330@)。

    第一次序列化class/deserialize json的过程没有Go那么快,但是flutter没有反射。

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-21
      • 2018-10-15
      • 2020-05-10
      • 2019-07-17
      相关资源
      最近更新 更多