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>
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!