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 属性を処理するときに Json.NET の動作をより効果的に制御できるため、潜在的なエラーが回避され、コードの堅牢性が向上します。
以上がJson.NET で JSON 逆シリアル化中に欠落しているフィールドを処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。