Json.NET 中處理 JSON 反序列化期間缺失欄位的方法
在使用 Json.NET 反序列化 JSON 物件時,正確處理缺失欄位至關重要。預設情況下,Json.NET 會忽略缺少的屬性並傳回預設值,這可能會在後續處理過程中導致錯誤。
考慮以下程式碼:
<code class="language-csharp">using Newtonsoft.Json; namespace Json_Fail_Test { [JsonObject(MemberSerialization.OptOut)] private class MyJsonObjView { [JsonProperty("MyJsonInt")] public int MyJsonInt { get; set; } } static void Main(string[] args) { string correctData = @"{'MyJsonInt': 42}"; string wrongData = @"{'SomeOtherProperty': 'fbe8c20b'}"; var goodObj = JsonConvert.DeserializeObject<MyJsonObjView>(correctData); var badObj = JsonConvert.DeserializeObject<MyJsonObjView>(wrongData); Console.WriteLine(goodObj.MyJsonInt); // 输出 42 Console.WriteLine(badObj.MyJsonInt); // 输出 0 } }</code>
這段程式碼嘗試將 JSON 物件反序列化為 MyJsonObjView 物件。正確的 JSON 包含 "MyJsonInt" 屬性,而錯誤的 JSON 則沒有。輸出結果如下:
<code>42 0</code>
如您所見,程式碼在反序列化錯誤的 JSON 時會靜默失敗,為缺少的屬性傳回預設值。為避免此類行為,我們可以使用 MissingMemberHandling
設定。
<code class="language-csharp">JsonSerializerSettings settings = new JsonSerializerSettings(); settings.MissingMemberHandling = MissingMemberHandling.Error;</code>
透過將 MissingMemberHandling
設為 Error
,我們指示 Json.NET 在反序列化期間遇到缺失屬性時拋出異常。
<code class="language-csharp">try { var goodObj = JsonConvert.DeserializeObject<MyJsonObjView>(correctData, settings); var badObj = JsonConvert.DeserializeObject<MyJsonObjView>(wrongData, settings); } catch (Exception ex) { Console.WriteLine(ex.GetType().Name + ": " + ex.Message); }</code>
現在,如果我們反序列化錯誤的 JSON,將會得到一個異常:
<code>JsonSerializationException: Could not find member 'SomeOtherProperty' on object of type 'MyJsonObjView'. Path 'SomeOtherProperty', line 3, position 33.</code>
此異常清楚地表明反序列化由於缺失屬性而失敗,使我們能夠適當地處理錯誤。
透過設定 MissingMemberHandling
屬性,我們可以更有效地控制 Json.NET 在處理缺少 JSON 屬性時的行為,從而避免潛在的錯誤和提高程式碼的健全性。
以上是Json.NET 中 JSON 反序列化過程中如何處理缺失欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!