Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Mencegah StackOverflowException Apabila Menggunakan Atribut JsonConvert dalam JSON.Net?

Bagaimana untuk Mencegah StackOverflowException Apabila Menggunakan Atribut JsonConvert dalam JSON.Net?

Mary-Kate Olsen
Lepaskan: 2025-01-20 15:21:12
asal
1071 orang telah melayarinya

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

Mengatasi StackOverflowException dalam Atribut [JsonConvert()] JSON.Net

Menggunakan atribut [JsonConvert()] dalam JSON.Net untuk meratakan siri kelas boleh membawa kepada StackOverflowException. Ini berlaku disebabkan pengulangan tak terhingga semasa proses penyirian JSON.

Untuk memintas perkara ini, JsonConverter tersuai dengan kaedah WriteJson tersuai diperlukan. Kaedah ini mesti memastikan penamatan proses bersiri yang betul. Walau bagaimanapun, mencipta kaedah ini boleh menjadi rumit, menuntut pengendalian berhati-hati bagi jenis boleh batal, jenis nilai dan atribut penukar JSON.

Penyelesaian yang teguh melibatkan pengesahan siri pada setiap hartanah untuk mengelakkan berulang kitaran. Kod berikut menunjukkan pendekatan ini:

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);
}
Salin selepas log masuk

Kod ini secara berkesan menghalang pengecualian dengan menyemak nilai nol, melangkau sifat yang diabaikan dan melaksanakan ShouldSerialize logik dalam penukar tersuai, dengan itu memastikan pensirian JSON yang betul.

Atas ialah kandungan terperinci Bagaimana untuk Mencegah StackOverflowException Apabila Menggunakan Atribut JsonConvert dalam JSON.Net?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan