57 votos

cómo deserializar JSON en IEnumerable<BaseType> con Newtonsoft JSON.NET

dada esta JSON:

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

y estas clases:

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

¿Cómo puedo deserializar el JSON en:

IEnumerable<BaseClass> deserialized;

No puedo usar JsonConvert.Deserialize<IEnumerable<BaseClass>>() porque se queja de que BaseClass es abstracta.

Gracias

75voto

Andrew Bullock Puntos 14899

usted necesita:

new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }

así que el JSON que se parece a esto:

{
  "$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",
    }
  ]
}

a continuación, pasar null como el tipo de youre tratando de deserializar a:

JsonConvert.Deserialize(strJson, null, settings)

6voto

Sunil S Puntos 26

utilice el siguiente JsonSerializerSettings construir mientras deserializar :

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

0voto

Andrew Bullock Puntos 14899

Usted también podría envolver el enumerable en una clase:

class Wrapper
{
    IEnumerable<BaseClass> classes;
}

a continuación, serializar y deserializar este.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: