iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 18
0
自我挑戰組

半路出家的工程師重新認識 JavaScript系列 第 18

18. (番外篇) 五分鐘實作 C# 介接 OpenData(政府行政機關辦公日曆表)

  • 分享至 

  • xImage
  •  

前言

今天主要講的是快速介接政府資料開放平臺上的政府行政機關辦公日曆表

緣由是最近實作一個小型的工作行事曆

主要是讓客戶可以送件時,可以計算交件期限

邏輯蠻簡單的,從送件日根據案件等級往後推 N 個工作天即是

所以我們需要幾個資訊

  1. 送件日期
  2. 案件等級
  3. 判別工作日與例假日

工作日與例假日的部分,希望每年都可以匯入人事行政處公布的辦公日曆表

之後若遇颱風或其他不可抗拒因素彈性放假時,也要有地方可以手動調整

那我們就開始先接資料吧


先找到資料來源

  1. 先到 政府行政機關辦公日曆表 點選 JSON 檢視資料
    如圖
  2. 複製 資料網址
  3. 將網址貼到 Chrome 上就可以看到要接收的資料了
    data

發送 Http request & 接收 response

  1. 我們要先建立一個 WebRequest
var url = "http://data.ntpc.gov.tw/api/v1/rest/datastore/382000000A-000077-002";
var request = WebRequest.Create(url);
// 透過 Chrome 開發者工具可以取得 Method, ContentType
request.Method = "GET";
request.ContentType = "application/json;charset=UTF-8";
  1. 取得 request 的 response stream
var response = request.GetResponse() as HttpWebResponse;
var responseStream = response.GetResponseStream();
var reader = new StreamReader(responseStrea  Encoding.GetEncoding("utf-8"));
var srcString = reader.ReadToEnd();
  1. srcString 就是我們要的資料了

建立 JSON 格式對應的 class

感謝 Visual studio 提供強大的貼上 JSON 做為類別 功能

  1. 先複製在 Chrome 貼上資料來源後,畫面中的 JSON 資料
    copy
  2. 建立一個 class
    create class
  3. 編輯(E) => 選擇性貼上(S) => 貼上 JSON 做為類別(J)
    paste

將剛剛的 response string 轉為 class 吧

我利用 Newtonsoft 提供的轉型方法

var jsonData = Newtonsoft.Json.JsonConvert.DeserializeObject<HolidayOpenData>(srcString);

整段 code 看起來就會是

static void Main(string[] args)
{
    var url = "http://data.ntpc.gov.tw/api/v1/rest/datastore/382000000A-000077-002";
    var request = WebRequest.Create(url);

    var response = request.GetResponse() as HttpWebResponse;
    var responseStream = response.GetResponseStream();
    var reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
    var srcString = reader.ReadToEnd();
    var jsonData = Newtonsoft.Json.JsonConvert
        .DeserializeObject<HolidayOpenData>(srcString);
    foreach (var holiday in jsonData.result.records)
    {
        Console.WriteLine($"Date: {holiday.date}, IsHoliday: {holiday.isHoliday}, Category: {holiday.holidayCategory}");
    }
    Console.ReadKey();
}

運行結果如圖

result

結論

目前用簡單的方式先接資料

看之後要開 thread 或是採用 async await 方式都可以

完整的程式碼在 Github 上 https://github.com/ChiYunJai/Day18_OpenData

目前有個小缺點是她日期為 string

看之後轉型成 DateTime 會比較方便處理

接著開一張資料表紀錄某年某月某天是否為工作日即可

匯入步驟也很簡單

  1. 先將 openData 取得所有 IsHoliday = "是" 的日期匯入
  2. 剩下的都是為工作日匯入
  3. 提供介面讓使用者可以根據情況調整某天為工作日或例假日即可

最後在算交件期限時,用送件日期當 query 條件去找即可!


上一篇
17. 個人筆記之常複製的方法整理集
下一篇
19. Speaking JavaScript - Math
系列文
半路出家的工程師重新認識 JavaScript30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言