如何在Flutter中重新组合JSON以匹配数据类型?

问题描述

这里的目标是按日期对JSON数据进行分组并将其转换为Flutter中的对象。

我正在使用的服务API以以下格式返回JSON:

        {
            "id": 1,"name": "Article Name","created_at": "2020-01-10T00:33:09.000000Z",},{
            "id": 2,

我需要将其转换为以下格式:

  Map<String,List<Article>> ArticleHistory = {
    '04.08.2020': [
      Article(id: 16,name: 'Article Name'),Article(id: 15,Article(id: 14,Article(id: 13,],'03.08.2020': [
      Article(id: 12,Article(id: 11,Article(id: 10,Article(id: 9,'02.08.2020': [
      Article(id: 8,Article(id: 7,Article(id: 6,Article(id: 5,'01.08.2020': [
      Article(id: 4,Article(id: 3,Article(id: 2,Article(id: 1,};        

如何实现?

解决方法

让您拥有以下格式的数据:

List<Map<String,dynamic>> articlesListJson = [
  {
    "id": 1,"name": "Article 1","created_at": "2020-08-01T00:30:00.000000Z",},{
    "id": 2,"name": "Article 2","created_at": "2020-08-01T00:45:00.000000Z",{
    "id": 3,"name": "Article 3","created_at": "2020-08-02T00:00:00.000000Z",];

(如果您有一个json字符串,则使用jsonDecode函数将其解析为Dart的List的{​​{1}})。

当您要将日期存储为dd.mm.yyyy String时,编写一个辅助函数,将Map转换为2020-08-01T00:30:00.000000Z

01.08.2020

然后您就可以按日期对列表进行分组:

String extractDateString(String dateTimeString) {
  DateTime dateTime = DateTime.parse(dateTimeString);
  String day = dateTime.day.toString().padLeft(2,'0');
  String month = dateTime.month.toString().padLeft(2,'0');
  String year = dateTime.year.toString().padLeft(4,'0');
  return '$day.$month.$year';
}

Map<String,List<Map<String,dynamic>>> articleGroupsJson = groupBy( articlesListJson,(a) => extractDateString(a['created_at']),); // {'01.08.2020': [{...},{...}],'02.08.2020': [{...}]} 来自collection软件包。依靠它或只是复制粘贴function source

现在将每个groupBy解析为Map<String,dynamic>类:

Article

以一种标准方式:

class Article {
  int id;
  String name;
  
  Article({this.id,this.name});
}

因为数据已经分组,而不是简单地映射列表,而是需要映射组,并且每个组都映射其值(即列表)

Article parseArticle(Map<String,dynamic> map) {
  return Article(
    id: map['id'],name: map['name'],);
}

现在Map<String,List<Article>> articleGroups = articleGroupsJson.map( (date,list) => MapEntry( date,list.map(parseArticle).toList(),),); 具有您想要的结构