ホームページ >バックエンド開発 >C++ >逆シリアル化中に欠落しているフィールドに対して Json.NET で例外をスローするにはどうすればよいですか?

逆シリアル化中に欠落しているフィールドに対して Json.NET で例外をスローするにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-19 05:59:10730ブラウズ

How Can I Make Json.NET Throw Exceptions for Missing Fields During Deserialization?

Json.NET を使用した JSON 逆シリアル化中の欠落フィールドの検出

JSON 逆シリアル化では、欠落しているフィールドの処理が重要です。デフォルトでは、Json.NET のシリアライザーは、フィールドが欠落している場合に、サイレントにデフォルト値を返します。この動作により、不正なプロパティを持つオブジェクトを逆シリアル化するときに、検出されないエラーが発生する可能性があります。

質問:

フィールドが欠落しているオブジェクトを逆シリアル化するときに、Json.NET シリアライザーが例外をスローしないという問題が発生しています。代わりに、デフォルト値が返されるため、不正なデータの検出が困難になります。

解決策:

Json.NET は、構成可能な MissingMemberHandling 設定を提供します。これを Error に設定すると、逆シリアル化中に欠落フィールドが見つかったときに JsonSerializationException を発生させるようにシリアライザーに指示します。こうすることで、そのようなエラーをコード内で明示的に処理できます。

コード:

<code class="language-csharp">using Newtonsoft.Json;

try
{
    // 读取JSON字符串
    const string correctData = @"{ 'MyJsonInt': 42 }";
    const string wrongData = @"{ 'SomeOtherProperty': 'fbe8c20b' }";

    // 创建序列化器设置
    JsonSerializerSettings settings = new JsonSerializerSettings();
    settings.MissingMemberHandling = MissingMemberHandling.Error;

    // 反序列化对象
    var goodObj = JsonConvert.DeserializeObject<MyJsonObjView>(correctData, settings);
    Console.WriteLine(goodObj.MyJsonInt.ToString());

    var badObj = JsonConvert.DeserializeObject<MyJsonObjView>(wrongData, settings);
    Console.WriteLine(badObj.MyJsonInt.ToString());
}
catch (Exception ex)
{
    Console.WriteLine(ex.GetType().Name + ": " + ex.Message);
}</code>

出力:

<code>42
JsonSerializationException: Could not find member 'SomeOtherProperty' on object
of type 'MyJsonObjView'. Path 'SomeOtherProperty', line 3, position 33.</code>

MissingMemberHandlingError に設定すると、フィールドが欠落しているオブジェクトに対してシリアライザーが JsonSerializationException をスローするようになり、エラーを処理してデータの整合性を確保できるようになります。

以上が逆シリアル化中に欠落しているフィールドに対して Json.NET で例外をスローするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。