json.net (newtonsoft)
Estoy revisando la documentación pero no puedo encontrar nada sobre esto o la mejor manera de hacerlo.
public class Base
{
public string Name;
}
public class Derived : Base
{
public string Something;
}
JsonConvert.Deserialize<List<Base>>(text);
Ahora tengo objetos derivados en la lista serializada. ¿Cómo deserializo la lista y recupero los tipos derivados?
c#
json
serialization
json.net
Será
fuente
fuente
Respuestas:
Si está almacenando el tipo en su
text
(como debería estar en este escenario), puede usar elJsonSerializerSettings
.Ver: cómo deserializar JSON en IEnumerable <BaseType> con Newtonsoft JSON.NET
Pero ten cuidado. Usar cualquier otra cosa
TypeNameHandling = TypeNameHandling.None
podría exponerse a una vulnerabilidad de seguridad .fuente
TypeNameHandling = TypeNameHandling.Auto
: esto agregará una$type
propiedad SOLO para instancias donde el tipo declarado (es decirBase
) no coincide con el tipo de instancia (es decirDerived
). De esta manera, no hincha tanto tu JSON comoTypeNameHandling.All
.Debe habilitar el Manejo de nombres de tipo y pasarlo al (des) serializador como parámetro de configuración.
Esto dará como resultado la deserialización correcta de las clases derivadas. Un inconveniente es que nombrará todos los objetos que está usando, como tal, nombrará la lista en la que está colocando los objetos.
fuente
TypeNameHandling.Auto
también lo hará, y es más agradable porque no escribe el nombre del tipo de instancia cuando coincide con el tipo de campo / propiedad, que suele ser el caso de la mayoría de los campos / propiedades.Dado que la pregunta es tan popular, puede ser útil agregar qué hacer si desea controlar el nombre de la propiedad de tipo y su valor.
El camino más largo es escribir correos electrónicos personalizados
JsonConverter
para manejar la (des) serialización comprobando y configurando manualmente la propiedad de tipo.Una forma más sencilla es usar JsonSubTypes , que maneja todo el texto estándar a través de atributos:
fuente
Use este JsonKnownTypes , es una forma muy similar de usar, solo agrega discriminador a json:
Ahora al serializar objeto en JSON será agrega
"$type"
con"base"
y"derived"
valor y se puede utilizar para deserializarEjemplo de lista serializada:
fuente