2016-06-06 1 views
1

J'ai sérialisé un objet complexe (contenant des classes abstraites, propriétés en lecture seule) en utilisant Newtonsoft.Jsonconverter SerializeObject avec succès. Tout en essayant de désérialiser le même en utilisant la méthode DeserializeObject, il renvoie l'erreur de suivi - Un élément avec cette clé a déjà été ajouté. Après un examen plus approfondi, j'ai découvert qu'il pouvait y avoir des propriétés dans l'objet avec le même nom. Mais je n'ai trouvé aucun nom de propriété répété dans le fichier json en cours de sérialisation.NewtonSoft.Json JsonConvert Erreur de désérialisation

version NewtonSoft Json: 8.0.3

+2

Pouvez-vous poster des extraits de code pertinents, peut-être des exemples de JSON. – Peter4499

+0

Pouvez-vous poster le code, ou vérifier que votre classe peut être dans la classe de base? Le même nom de propriété existe si c'est le cas, masquer ces propriétés dans votre classe à l'aide du nouveau mot-clé. –

+0

Pouvez-vous élaborer avec ce que vous avez essayé. Voici quelques requêtes connexes qui pourraient vous être utiles https://stackoverflow.com/questions/22096427/can-i-make-a-strict-deserialization-with-newtonsoft-json?rq=1 https: // stackoverflow. com/questions/24147989/error-deserializing-a-json-chaîne-dans-un-objet-composite? rq = 1 –

Répondre

0

Salut, je tente de reproduire votre erreur, mais en fait ce que je suis arrivé était un bon résultat. c'est le test que j'ai fait:

using Newtonsoft.Json; 
using System; 
using System.Collections.Generic; 

namespace ConsoleApplication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var child = new Child(); 
      var serializesObject = JsonConvert.SerializeObject(child); 

      var deserializedObject = JsonConvert.DeserializeObject(serializesObject, typeof(Child)); 
     }   
    } 

    public abstract class Abstract 
    { 
     public int Prop1 { get; set; } 
     public readonly string Prop2; 
     public List<string> Prop3 { get; set; } 
     public int[] Prop4 { get; set; } 

     public abstract void Hey(); 

     public Abstract() 
     { 
      Prop1 = 1; 
      Prop2 = "2"; 
      Prop3 = new List<string>(); 
      Prop4 = new int[4]; 
     } 
    } 

    public class Child : Abstract 
    { 
     public readonly string Prop5; 

     public Child() 
     { 
      Prop5 = "5"; 

     } 
     public override void Hey() 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 

J'espère que ce code peut vous aider à obtenir le résultat attendu.

Cheers,

+0

Le problème persiste cependant. Cela pose-t-il un problème lors de la désérialisation si nous avons une propriété avec le nom "RuntimeInfo"? cette propriété est de type classe RuntimeInfo. Si je renomme cette propriété en RuntimeInfo1, elle est désérialisée avec succès. – Kaveesha

+0

Quelqu'un peut-il me faire savoir comment puis-je trouver quelle touche est répétée dans mon dictionnaire qui provoque "Un élément avec cette clé a déjà été ajouté" pendant la désérialisation. – Kaveesha

+0

Salut @ Kaveesha, d'où vient cette classe RuntimeInfo? – VictorB