【C#】物件與JSON之間的操作與Library 選擇

  • 355
  • 0
  • C#
  • 2021-05-31

物件與JSON之間的操作與Library 選擇
系統環境:Windows 10、Visual Studio 2017

內容摘要
在進行資料交換時,通常會需要使用 XML 或是 JSON 格式來傳輸,以目前來說最主流的就是JSON。這次介紹一下在物件與JSON間的操作吧。

解決辦法
這邊稍微有幾點可以先提到一下:
1.  如果只想要序列化特定的欄位,在物件的欄位上加上[JsonInclude]的屬性就可以了
2.  Json 轉物件時schema 如果是不一樣的也沒關係,系統是以欄位名稱去做轉換的,所以只會轉換出對應的欄位。但是如果型別不一樣的話,轉換就會錯誤

微軟本身就有內建的Library:System.Text.Json 可以轉換出JSON 字串,以下展示最普通的範例,如有需要其他特別功能,就需要再查文件:
https://docs.microsoft.com/zh-tw/dotnet/standard/serialization/system-text-json-how-to?pivots=dotnet-5-0
序列化:物件變Json

public void GetJsonString<T>(T obj)
{
    // 序列化的設定,這邊舉出常用的
    var options = new JsonSerializerOptions
    {
        WriteIndented = true    // 輸出格式化的JSON 字串
    };
    
    // 可以使用預設的,只傳入物件當參數
    var json = JsonSerializer.Serialize(obj);

    // 也可以套用設定,取得json 字串
    var json2 = JsonSerializer.Serialize(obj, option);
}

反序列化:Json 變物件

public void GetObject<T>(string json)
{
    // 使用預設的,只傳入JSON 字串當參數,即可獲得物件
    T obj = System.Text.Json.JsonSerializer.Deserialize<T>(json);            
}

※ 2021/05/31 更新 System.Text.Json vs NewtonSoft.Json
簡單來說,如果只進行Json 的基本操作,那差別就在於效率考量。
System.Text.Json 在.net core 3.0 以上效率會比 NewtonSoft 好,3.0以下甚至是.net framework 可以選擇NewtonSoft

相關連結
https://stackoverflow.com/questions/47455010/how-to-create-a-dynamic-list-from-other-lists-with-c-sharp
https://stackoverflow.com/questions/8334527/c-sharp-save-listt-to-xml-file
https://totoroliu.medium.com/net-core-system-text-json-vs-newtonsoft-json-c3e7691fdeb7
https://blog.darkthread.net/blog/system-text-json/

點子
https://www.telerik.com/forums/how-to-pass-object-as-report-parameter

https://docs.microsoft.com/zh-tw/dotnet/framework/wcf/feature-details/how-to-serialize-and-deserialize-json-data
Json.NET
https://www.codeproject.com/Questions/1097722/Convert-json-string-to-object-in-webapi-using-Csha