问题描述
这里的目标是按日期对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(),),);
具有您想要的结构