using System; using System.Collections.Generic; using System.Text; // // // To parse this JSON data, add NuGet 'Newtonsoft.Json' then do: // // using QuickType; // // var welcome = Welcome.FromJson(jsonString); namespace RainApi { using System; using System.Collections.Generic; using System.Globalization; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Linq; public partial class Welcome { public Xml Xml { get; set; } public Alert Alert { get; set; } } public partial class Alert { public string Xmlns { get; set; } public string Identifier { get; set; } public string Sender { get; set; } public DateTimeOffset Sent { get; set; } public string Status { get; set; } public string MsgType { get; set; } public string Scope { get; set; } public string References { get; set; } //此標籤為將資料統一轉成陣列,因氣象局資料會根據狀況傳回單個物件或陣列,會導致解析失敗 [JsonConverter(typeof(SingleOrArrayConverter))] public List Info { get; set; } } public partial class Info { public string Language { get; set; } public string Category { get; set; } public string Event { get; set; } public string Urgency { get; set; } public string Severity { get; set; } public string Certainty { get; set; } public EventCode EventCode { get; set; } public DateTimeOffset Effective { get; set; } public DateTimeOffset Onset { get; set; } public DateTimeOffset Expires { get; set; } public string SenderName { get; set; } public string Headline { get; set; } public string Description { get; set; } public string Instruction { get; set; } public Uri Web { get; set; } //此標籤為將資料統一轉成陣列,因氣象局資料會根據狀況傳回單個物件或陣列,會導致解析失敗 [JsonConverter(typeof(SingleOrArrayConverter))] public List Parameter { get; set; } public List Area { get; set; } } public partial class Area { public string AreaDesc { get; set; } public EventCode Geocode { get; set; } } public partial class EventCode { public string ValueName { get; set; } public string Value { get; set; } } public partial class Xml { public string Version { get; set; } public string Encoding { get; set; } } public enum ValueName { AlertTitle, ProfileCapTwpEvent10, TaiwanGeocode103 }; //此標籤為將資料統一轉成陣列,因氣象局資料會根據狀況傳回單個物件或陣列,會導致解析失敗 public class SingleOrArrayConverter : JsonConverter { // 判斷是否可以轉換該類型,這裡只處理 List 類型 public override bool CanConvert(Type objectType) { return (objectType == typeof(List)); } // 讀取 JSON 並轉換成對應的物件 public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var token = JToken.Load(reader); // 讀取 JSON 標記 if (token.Type == JTokenType.Array) // 如果是陣列 { return token.ToObject>(); // 轉換成 List } else // 如果不是陣列 { return new List { token.ToObject() }; // 包裝成單一物件的 List } } // 將物件寫入 JSON public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var list = value as List; // 將值轉換成 List if (list.Count == 1) // 如果列表中只有一個元素 { serializer.Serialize(writer, list[0]); // 直接序列化該元素 } else // 如果列表中有多個元素 { serializer.Serialize(writer, list); // 序列化整個列表 } } } }