ホームページ > バックエンド開発 > C++ > JSON.Net で JsonConvert 属性を使用するときに StackOverflowException を防ぐ方法は?

JSON.Net で JsonConvert 属性を使用するときに StackOverflowException を防ぐ方法は?

Mary-Kate Olsen
リリース: 2025-01-20 15:21:12
オリジナル
1054 人が閲覧しました

How to Prevent StackOverflowException When Using JsonConvert Attribute in JSON.Net?

JSON.Net の [JsonConvert()] 属性での StackOverflowException のアドレス指定

クラスのシリアル化をフラット化するために JSON.Net 内の [JsonConvert()] 属性を利用すると、StackOverflowException が発生する可能性があります。これは、JSON シリアル化プロセス中の無限再帰によって発生します。

これを回避するには、オーバーライドされた JsonConverter メソッドを含むカスタム WriteJson が必要です。 このメソッドは、シリアル化プロセスを適切に終了することを保証する必要があります。 ただし、このメソッドの作成は複雑になる可能性があり、null 許容型、値型、および JSON コンバーター属性を慎重に処理する必要があります。

堅牢なソリューションには、循環再帰を防ぐために各プロパティでシリアル化を検証することが含まれます。次のコードは、このアプローチを示しています。

<code class="language-csharp">public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
    if (ReferenceEquals(value, null)) {
        writer.WriteNull();
        return;
    }

    var contract = (JsonObjectContract)serializer
        .ContractResolver
        .ResolveContract(value.GetType());

    writer.WriteStartObject();

    foreach (var property in contract.Properties) {
        if (property.Ignored) continue;
        if (!ShouldSerialize(property, value)) continue;

        var propertyName = property.PropertyName;
        var propertyValue = property.ValueProvider.GetValue(value);

        writer.WritePropertyName(propertyName);
        if (property.Converter != null && property.Converter.CanWrite) {
            property.Converter.WriteJson(writer, propertyValue, serializer);
        } else {
            serializer.Serialize(writer, propertyValue);
        }
    }

    writer.WriteEndObject();
}

private static bool ShouldSerialize(JsonProperty property, object instance) {
    return property.ShouldSerialize == null 
        || property.ShouldSerialize(instance);
}</code>
ログイン後にコピー

このコードは、null 値のチェック、無視されたプロパティのスキップ、カスタム コンバーター内での ShouldSerialize ロジックの実装によって例外を効果的に防止し、それによって正しい JSON シリアル化を保証します。

以上がJSON.Net で JsonConvert 属性を使用するときに StackOverflowException を防ぐ方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート