主頁 > 軟體工程 > 如何對JsonApi資料進行排序?

如何對JsonApi資料進行排序?

2022-01-12 05:45:09 軟體工程

我正在嘗試從我從 JSON API 獲得的資料中按日期對串列進行排序。JSON 是一個被序列化為模型的 Map。我嘗試了幾件事,但都沒有奏效。知道該怎么做嗎?不確定我是否應該在 Listview.builder 或 API 請求類中對其進行排序。

API 請求類

import 'package:http/http.dart' as http;
import 'package:lets_chat/app/modules/events/models/events.dart';



class EventApi {
  static var client = http.Client();


  static Future<Event?> fetchEvents() async {
    final response = await client.get(Uri.parse(
        'https://xposure.ae/wp-json/wp/auditorium/v1/events'));
    if (response.statusCode == 200) {
      var jsonString = response.body;
      return eventFromJson(jsonString);
    } else {
      //show error message
      return null;
    }
  }
}

模型類

import 'package:meta/meta.dart';
import 'dart:convert';

Event eventFromJson(String str) => Event.fromJson(json.decode(str));

String eventToJson(Event data) => json.encode(data.toJson());

class Event {
  Event({
    @required this.data,
  });

  List<Datum>? data;

  @override
  void initState() {
    data!.sort((a, b) => a.datetime.compareTo(b.datetime));
  }


  factory Event.fromJson(Map<String, dynamic> json) => Event(
    data: json["data"] == null ? null : List<Datum>.from(json["data"].map((x) => Datum.fromJson(x))),
  );

  Map<String, dynamic> toJson() => {
    "data": data == null ? null : List<dynamic>.from(data!.map((x) => x.toJson())),
  };
}

class Datum {
  Datum({
    required this.eventtitle,
    required this.description,
    required this.eventImage,
    required this.speaker,
    required this.datetime,
    required this.location,
  });

  String eventtitle;
  String description;
  String eventImage;
  Speaker? speaker;
  String datetime;
  Location? location;


  factory Datum.fromJson(Map<String, dynamic> json) => Datum(
    eventtitle: json["Eventtitle"] == null ? null : json["Eventtitle"],
    description: json["Description"] == null ? null : json["Description"],
    eventImage: json["event_image"] == null ? null : json["event_image"],
    speaker: json["Speaker"] == null ? null : Speaker.fromJson(json["Speaker"]),
    datetime: json["datetime"] == null ? null : json["datetime"],
    location: json["Location"] == null ? null : Location.fromJson(json["Location"]),
  );

  Map<String, dynamic> toJson() => {
    "Eventtitle": eventtitle == null ? null : eventtitle,
    "Description": description == null ? null : description,
    "event_image": eventImage == null ? null : eventImage,
    "Speaker": speaker == null ? null : speaker!.toJson(),
    "datetime": datetime == null ? null : datetime,
    "Location": location == null ? null : location!.toJson(),
  };
}

class Location {
  Location({
    required this.venue,
    required this.address,
  });

  Venue? venue;
  Address? address;

  factory Location.fromJson(Map<String, dynamic> json) => Location(
    venue: json["venue"] == null ? null : venueValues.map[json["venue"]],
    address: json["address"] == null ? null : addressValues.map[json["address"]],
  );

  Map<String, dynamic> toJson() => {
    "venue": venue == null ? null : venueValues.reverse[venue],
    "address": address == null ? null : addressValues.reverse[address],
  };
}

enum Address { SHARJAH_BR_SHARJAH_BR_61110_BR_UNITED_ARAB_EMIRATES }

final addressValues = EnumValues({
  "Sharjah</br>Sharjah,</br>61110,</br>United Arab Emirates": Address.SHARJAH_BR_SHARJAH_BR_61110_BR_UNITED_ARAB_EMIRATES
});

enum Venue { XPOSURE_INTERNATIONAL_PHOTOGRAPHY_FESTIVAL }

final venueValues = EnumValues({
  "Xposure International Photography Festival": Venue.XPOSURE_INTERNATIONAL_PHOTOGRAPHY_FESTIVAL
});

class Speaker {
  Speaker({
    required this.speakername,
    required this.link,
  });

  String speakername;
  String link;

  factory Speaker.fromJson(Map<String, dynamic> json) => Speaker(
    speakername: json["speakername"] == null ? null : json["speakername"],
    link: json["link"] == null ? null : json["link"],
  );

  Map<String, dynamic> toJson() => {
    "speakername": speakername == null ? null : speakername,
    "link": link == null ? null : link,
  };
}

class EnumValues<T> {
  Map<String, T> map;
  late Map<T, String> reverseMap;

  EnumValues(this.map);

  Map<T, String> get reverse {
    if (reverseMap == null) {
      reverseMap = map.map((k, v) => new MapEntry(v, k));
    }
    return reverseMap;
  }
}

甚至查看類

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:get/instance_manager.dart';
import 'package:lets_chat/app/modules/events/views/event_details.dart';
import 'package:lets_chat/app/modules/events/controllers/events_controller.dart';
import 'package:lets_chat/app/modules/events/views/event_tile.dart';

class EventView extends StatelessWidget {
  final EventsController eventController = Get.put(EventsController());

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.grey[800],
      appBar: AppBar(
        backgroundColor: Colors.grey[850],
        elevation: 2,
        leading: GestureDetector(
          onTap: () {
            Navigator.pop(context);
          },
          child: const Icon(
            Icons.arrow_back_ios,
            color: Colors.grey,
          ),
        ),
      ),
      body: Column(
        children: [
          Expanded(
            child: Obx(() {
              if (eventController.isLoading.value)
                return Center(child: CircularProgressIndicator(
                  color: Colors.red,
                ));
              else {
                return ListView.builder(
                    itemCount: eventController.event.value!.data!.length,
                    itemBuilder: (context, index) {
                      return GestureDetector(
                        onTap: () {
                          Navigator.push(
                            context, MaterialPageRoute(builder: (context) => EventDetails(event: eventController.event.value!.data![index]))
                          );
                        },
                          child: EventTile(eventController.event.value!.data![index]));
                    });
              }
            }),
          )
        ],
      ),
    );
  }
}

uj5u.com熱心網友回復:

以下是如何對來自 JSON API 的資料進行排序。

 Widget build(BuildContext context) {
return MaterialApp(
  home: Scaffold(
      appBar: AppBar(
        title: Text("Events",
            style: TextStyle(color: Colors.black, fontSize: 16)),
        backgroundColor: Color(0xffffffff),
        elevation: 0.0,
        actions: [
          TextButton.icon(
              icon: Icon(
                Icons.refresh,
                color: Colors.black,
              ),
              onPressed: () {
                if (ascend) {
                  sortAscending(); //to sort the date from oldest to latest
                } else {
                  sortDescending(); //to sort the date from latest to oldest
                }
              },
              label: Text(
                "Sort by date",
                style: TextStyle(fontSize: 11, color: Colors.black),
              ))
        ],
      ),
      body: SingleChildScrollView(
        child: Padding(
          padding: EdgeInsets.only(left: 5),
          child: Column(
            children: _buildList(),
          ),
        ),
      )),
  debugShowCheckedModeBanner: false,
);

}

下面的代碼可以幫助您構建一系列小部件

 List<Widget> _buildList() {
List<Widget> x = [];

//jsonData refers to the data from the JSON API

for (int i = 0; i < jsonData.length; i  ) {
  DateTime dateTime =
      DateFormat("MMMM dd, yyyy - kk:mm").parse(jsonData[i]['datetime']);

  x.add(
    Row(children: [
      Flex(
          mainAxisAlignment: MainAxisAlignment.center,
          direction: Axis.vertical,
          children: [
            Text(months[dateTime.month - 1].toString(),
                style:
                    TextStyle(fontWeight: FontWeight.bold, fontSize: 14)),
            Card(
              child: Container(
                  padding: const EdgeInsets.all(8.0),
                  child: Flex(direction: Axis.vertical, children: [
                    Text(
                      dateTime.day.toString(),
                      style: TextStyle(
                          fontWeight: FontWeight.bold,
                          color: Color(0xff800200),
                          fontSize: 22),
                    ),
                    Padding(
                      padding: EdgeInsets.only(top: 5),
                      child: Text(
                        dateTime.year.toString(),
                        style: TextStyle(fontSize: 11),
                      ),
                    )
                  ])),
            ),
          ]),
      Flexible(
        child: Card(
          semanticContainer: true,
          clipBehavior: Clip.antiAliasWithSaveLayer,
          child: Container(
            height: 200,
            decoration: new BoxDecoration(
              image: new DecorationImage(
                image: NetworkImage(jsonData[i]['event_image']),
                fit: BoxFit.fill,
                colorFilter: new ColorFilter.mode(
                    Colors.black.withOpacity(0.25), BlendMode.dstATop),
              ),
            ),
            child: Padding(
              padding: EdgeInsets.only(right: 10, left: 10, bottom: 5),
              child: Column(
                mainAxisAlignment: MainAxisAlignment.end,
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Text(jsonData[i]['Eventtitle'],
                      style: TextStyle(fontWeight: FontWeight.w800)),
                  SizedBox(
                    height: 5,
                  ),
                  Row(
                    children: [
                      Icon(
                        Icons.pin_drop,
                        color: Colors.black54,
                      ),
                      Text(
                        jsonData[i]['Location']['venue'],
                        style: TextStyle(fontSize: 13),
                      )
                    ],
                  )
                ],
              ),
            ),
          ),
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(10.0),
          ),
          elevation: 5,
          margin: EdgeInsets.all(10),
        ),
      )
    ]),
  );
}

return x;

}

當您使用 AppBar 上的操作按鈕按日期排序時,以下功能將有助于更新串列

  sortAscending() {
setState(() {
  ascend = false; //initialize this bool variable at the top of the class.
  jsonData.sort((a, b) => DateFormat("MMMM dd, yyyy - kk:mm")
      .parse(b['datetime'])
      .compareTo(DateFormat("MMMM dd, yyyy - kk:mm").parse(a['datetime'])));
});

}

  sortDescending() {
setState(() {
  ascend = true;
  jsonData.sort((a, b) => DateFormat("MMMM dd, yyyy - kk:mm")
      .parse(a['datetime'])
      .compareTo(DateFormat("MMMM dd, yyyy - kk:mm").parse(b['datetime'])));
});

}

您將在下面使用來格式化月份的名稱。

List months = [  'JAN',  'FEB',  'MAR',  'APR',  'MAY',  'JUN',  'JUL',  'AUG', 'SEP',  'OCT',  'NOV',  'DEC'];

以下是說明的螢屏截圖:

如何對 Json Api 資料進行排序?

如何對 Json Api 資料進行排序?

如何對 Json Api 資料進行排序?

uj5u.com熱心網友回復:

您似乎將日期存盤String在 Model 類中。

然后它按字母順序排序:

void main() {
  List<String> dates = [
    "September 14, 2022 - 2:35 PM",
    "February 24, 2022 - 3:05 AM",
    "February 3, 2022 - 10:10 AM",
    "January 13, 2022 - 9:15 PM"
  ];
  dates.sort((a, b) => a.compareTo(b));
  dates.forEach(print);
}

// Dates get sorted alphabetically:
// February 24, 2022 - 3:05 pm
// February 3, 2022 - 10:10 pm
// January 13, 2022 - 9:15 pm
// September 14, 2022 - 2:35 pm

如果這是您面臨的問題,您可能應該在您的轉換中或(可能更好)在您的轉換DateTime中將它們轉換為物件sortfromJson

簡單的例子:

void main2() {
  List<DateTime> dates = [
    "September 14, 2022 - 2:35 PM",
    "February 24, 2022 - 3:05 AM",
    "February 3, 2022 - 10:10 AM",
    "January 13, 2022 - 9:15 PM"
  ].map((d) => DateFormat('MMMM d, y - h:mm a').parse(d)).toList();
  dates.sort((a, b) => a.compareTo(b));
  dates.forEach(print);
}

// Dates get sorted chronologically:
// 2022-01-13 21:15:00.000
// 2022-02-03 10:10:00.000
// 2022-02-24 03:05:00.000
// 2022-09-14 14:35:00.000

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/408529.html

標籤:

上一篇:在Windows上構建Laravel應用程式的docker映像時找不到000-default.conf

下一篇:使用VBAExcel宏的BitlyAPI呼叫

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more