Maison > développement back-end > C++ > Comment empêcher StackOverflowException lors de l'utilisation de l'attribut JsonConvert dans JSON.Net ?

Comment empêcher StackOverflowException lors de l'utilisation de l'attribut JsonConvert dans JSON.Net ?

Mary-Kate Olsen
Libérer: 2025-01-20 15:21:12
original
1054 Les gens l'ont consulté

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

Adressage de StackOverflowException dans l'attribut [JsonConvert()] de JSON.Net

L'utilisation de l'attribut [JsonConvert()] dans JSON.Net pour aplatir la sérialisation des classes peut conduire à un StackOverflowException. Cela se produit en raison d'une récursivité infinie pendant le processus de sérialisation JSON.

Pour contourner cela, une méthode JsonConverter personnalisée avec une méthode WriteJson remplacée est nécessaire. Cette méthode doit garantir la bonne fin du processus de sérialisation. Cependant, la création de cette méthode peut être complexe, exigeant une gestion minutieuse des types nullables, des types de valeur et des attributs du convertisseur JSON.

Une solution robuste consiste à valider la sérialisation au niveau de chaque propriété pour éviter la récursion cyclique. Le code suivant illustre cette approche :

<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>
Copier après la connexion

Ce code empêche efficacement l'exception en vérifiant les valeurs nulles, en ignorant les propriétés ignorées et en implémentant la logique ShouldSerialize dans le convertisseur personnalisé, garantissant ainsi une sérialisation JSON correcte.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal