json.net (newtonsoft)
Estou olhando a documentação, mas não consigo encontrar nada sobre isso ou a melhor maneira de fazer isso.
public class Base
{
public string Name;
}
public class Derived : Base
{
public string Something;
}
JsonConvert.Deserialize<List<Base>>(text);
Agora tenho objetos derivados na lista serializada. Como faço para desserializar a lista e recuperar os tipos derivados?
c#
json
serialization
json.net
Vai
fonte
fonte
Respostas:
Se você estiver armazenando o tipo em seu
text
(como deveria neste cenário), você pode usar oJsonSerializerSettings
.Veja: como desserializar JSON em IEnumerable <BaseType> com Newtonsoft JSON.NET
Mas tenha cuidado. Usar qualquer coisa diferente
TypeNameHandling = TypeNameHandling.None
pode abrir-se a uma vulnerabilidade de segurança .fonte
TypeNameHandling = TypeNameHandling.Auto
- isso adicionará uma$type
propriedade SOMENTE para instâncias onde o tipo declarado (ou seja,Base
) não corresponde ao tipo de instância (ou sejaDerived
). Dessa forma, ele não incha seu JSON tanto quantoTypeNameHandling.All
.Você deve habilitar o Tratamento de Nome de Tipo e passar isso para o (des) serializador como um parâmetro de configuração.
Isso resultará na desserialização correta das classes derivadas. Uma desvantagem é que nomeará todos os objetos que você está usando, assim como nomeará a lista na qual você está colocando os objetos.
fonte
TypeNameHandling.Auto
fará isso também, e é melhor porque não grava o nome do tipo de instância quando ele corresponde ao tipo do campo / propriedade, o que geralmente é o caso para a maioria dos campos / propriedades.Visto que a pergunta é tão popular, pode ser útil acrescentar o que fazer se quiser controlar o nome da propriedade do tipo e seu valor.
O longo caminho é escrever de forma personalizada
JsonConverter
s para lidar com a (des) serialização verificando e configurando manualmente a propriedade type.Uma maneira mais simples é usar JsonSubTypes , que lida com todo o boilerplate por meio de atributos:
fonte
Use este JsonKnownTypes , é uma forma muito semelhante de usar, basta adicionar discriminador ao json:
Agora, quando você serializar objeto em JSON será adicionar
"$type"
com"base"
e"derived"
valor e que vai ser usado para deserializeExemplo de lista serializada:
fonte