157 votes

JSON.Net boucle d'auto-référencement détectée

J'ai une base de données mssql pour mon site web avec 4 tables.

Quand je l'utilise :

public static string GetAllEventsForJSON()
{
    using (CyberDBDataContext db = new CyberDBDataContext())
    {
        return JsonConvert.SerializeObject((from a in db.Events where a.Active select a).ToList(), new JavaScriptDateTimeConverter());
    }
}

Le code donne lieu à l'erreur suivante :

Newtonsoft.Json.JsonSerializationException : Boucle d'auto-référencement détectée pour la propriété 'CyberUser' avec le type 'DAL.CyberUser'. Chemin '[0].EventRegistrations[0].CyberUser.UserLogs[0]'.

1voto

Alex Alvarez Points 181

L'instance de JsonSerializer peut être configurée pour ignorer les boucles de référence. Comme dans l'exemple suivant, cette fonction permet de sauvegarder un fichier avec le contenu de l'objet sérialisé json :

    public static void SaveJson<T>(this T obj, string FileName)
    {

       JsonSerializer serializer = new JsonSerializer();
        serializer.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
        using (StreamWriter sw = new StreamWriter(FileName))
        {
            using (JsonWriter writer = new JsonTextWriter(sw))
            {
                writer.Formatting = Formatting.Indented;
                serializer.Serialize(writer, obj);
            }
        }
    }

0voto

Simon_Weaver Points 31141

Assurez-vous qu'il ne vous manque aucun mot clé attendu.

Vous pouvez obtenir cette erreur si vous faites une erreur stupide comme oublier de await une méthode asynchrone.

    public async Task<JsonResult> GetTaxTable([FromServices] TaxService taxService)
    {
        var taxTable = /* await */ taxService.GetTaxTable();
        return new JsonResult(taxTable);
    }

Étant donné que GetTaxTable est une fonction asynchrone, si vous oubliez de await vous finirez par inadvertance par passer un Task à la JsonResult et une tâche n'est pas sérialisable. Donc, même si vous avez l'impression que tout vous échappe, la solution la plus simple est d'ajouter l'option await .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X