HOWTO · Csharp

如何在 C# 中將 JSON 字串轉換為 JObject

使用 Newtonsoft.Json 在 C# 中將 JSON 文字解析為 JObject,讀取巢狀值、處理解析錯誤並序列化變更。

本頁內容

若要在 C# 中將 JSON 文字轉換為記憶體中的物件,請安裝 Newtonsoft.Json 並使用該文字呼叫 JObject.Parse()。該方法會傳回一個 JObject,你可以讀取或更新其屬性。輸入必須已經是有效的 JSON;解析不會將任意純文字變成 JSON。

使用 JObject.Parse() 將 JSON 字串轉換為 JObject

使用 dotnet add package Newtonsoft.Json 安裝該套件。轉換本身是 JObject person = JObject.Parse(jsonText);;JObject.Parse() 是 Newtonsoft.Json 的一部分,要求該套件在專案中可用。下面的自包含 C# 範例使用內建的 System.Text.Json API,在沒有該外部相依性的情況下展示相同的輸入和屬性讀取流程。它建立的是 JsonDocument,而不是 JObject。

using System;
using System.Text.Json;

class Program
{
    static void Main()
    {
        string jsonText = "{\"name\":\"John\",\"address\":{\"city\":\"New York\"}}";
        using (JsonDocument person = JsonDocument.Parse(jsonText))
        {
            Console.WriteLine(person.RootElement.GetProperty("name").GetString());
            Console.WriteLine(person.RootElement.GetProperty("address").GetProperty("city").GetString());
        }
    }
}

在這裡,jsonText 是一個字串,person 是記憶體中的 JSON 文件。對於 Newtonsoft.Json 的 JObject,請如上所示使用 JObject.Parse(jsonText);它的索引器會傳回一個 JSON 權杖,該權杖可以表示字串、數字、巢狀物件、陣列或其他 JSON 值。內建範例使用 System.Text.Json 展示相同的 JSON 形狀,並不建立 JObject。

當 JSON 文字的根是具有命名屬性的物件時使用 JObject。如果根是陣列,請改用 Newtonsoft.Json 的 JArray API。將原始文字保留在字串變數中,然後將該變數傳遞給解析器;不要在整個 JSON 文件外再加一組引號。

處理無效的 JSON

JObject.Parse() 需要一個 JSON 物件。格式錯誤的 JSON 或非物件的頂層值可能會引發 JsonReaderException。當輸入來自外部來源時,請擷取該特定例外,並決定應用程式應如何報告或記錄該問題。C# 模式是 try { JObject person = JObject.Parse(jsonText); } catch (JsonReaderException) { Console.WriteLine("The JSON text could not be parsed."); }。這是未執行的語法說明,因為提供的執行階段缺少 Newtonsoft.Json。將 catch 集中在解析錯誤上;在應用程式程式碼中記錄解析器詳細資訊,而不是將其暴露給最終使用者。

catch 處理來自解析的失敗,因此應用程式的其餘部分可以選擇有用的回復方案、請求更正後的輸入或記錄診斷資訊。如果輸入已經可信且不可能出現格式錯誤的資料,呼叫端也可以讓例外傳播到其正常的錯誤處理常式。解析僅檢查 JSON 結構;它不會驗證應用程式所需的欄位是否存在或具有預期的業務含義。

從 JObject 讀取值

使用諸如 person["name"] 的索引器讀取頂層屬性。為巢狀值連結索引器,如 person["address"]?["city"];當中間屬性缺失或為 null 時,null 條件運算子會停止尋找。型別化存取器將權杖轉換為 .NET 值:例如 person.Value<string>("name") 或 person["age"]?.Value<int>()。選擇與 JSON 值相符的型別,並在應用程式需要時處理缺失的屬性。

當你希望繼續使用 JSON 權杖時,索引器很方便;而當需要 .NET 字串、整數或其他型別化值時,Value<T>() 很有用。安全尋找傳回 null 結果可以讓你的程式碼在使用中間值之前區分出它缺失。對於必需資料,請檢查權杖並報告缺少哪個屬性,而不是假設每個輸入都具有相同的形狀。

修改和序列化 JObject

為現有屬性賦值以更新它,或使用新的屬性名稱新增值。呼叫 ToString() 產生帶格式的 JSON 文字。例如,C# 操作是 person["age"] = 31;、person["city"] = "New York"; 和 string updatedJson = person.ToString();。這些 API 呼叫是未執行的說明,因為提供的執行階段缺少 Newtonsoft.Json。產生的字串將更新後的記憶體物件表示為 JSON,可以傳遞給需要 JSON 的 API 或儲存層。

修改會改變記憶體中的 JObject;它不會改變原始的 JSON 字串變數。在所有編輯完成後進行序列化,並在下一個步驟需要 JSON 的任何地方使用產生的文字。如果更喜歡緊湊的輸出,Newtonsoft.Json 還支援序列化格式選項;根據文字將由人阅读還是由另一個程式讀取來選擇格式。