73 votes

comment désérialiser JSON en IEnumerable <BaseType> avec Newtonsoft JSON.NET

étant donné ce JSON:

 [
  {
    "$id": "1",
    "$type": "MyAssembly.ClassA, MyAssembly",
    "Email": "me@here.com",
  },
  {
    "$id": "2",
    "$type": "MyAssembly.ClassB, MyAssembly",
    "Email": "me@here.com",
  }
]
 

et ces classes:

 public abstract class BaseClass
{
    public string Email;
}
public class ClassA : BaseClass
{
}
public class ClassB : BaseClass
{
}
 

Comment désérialiser le JSON en:

 IEnumerable<BaseClass> deserialized;
 

Je ne peux pas utiliser JsonConvert.Deserialize<IEnumerable<BaseClass>>() car il se plaint que BaseClass est abstrait.

Merci

98voto

Andrew Bullock Points 14899

vous avez besoin:

 new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }
 

donc le JSON ressemble à ceci:

 {
  "$type": "System.Collections.Generic.List`1[[MyAssembly.BaseClass, MyAssembly]], mscorlib",
  "$values": [
    {
      "$id": "1",
      "$type": "MyAssembly.ClassA, MyAssembly",
      "Email": "me@here.com",
    },
    {
      "$id": "2",
      "$type": "MyAssembly.ClassB, MyAssembly",
      "Email": "me@here.com",
    }
  ]
}
 

puis passez null comme type que vous essayez de désérialiser pour:

 JsonConvert.Deserialize(strJson, null, settings)
 

7voto

Sunil S Points 26

utilisez la construction JsonSerializerSettings suivante lors de la désérialisation:

 new JsonSerializerSettings()
{
    TypeNameHandling = TypeNameHandling.Objects
})
 

0voto

Andrew Bullock Points 14899

Vous pouvez également envelopper l'énumérable dans une classe:

 class Wrapper
{
    IEnumerable<BaseClass> classes;
}
 

puis sérialiser et désérialiser cela.

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