Skip to content

Deserialização Polimórfica

Use [JsonPolymorphic] com [JsonDerivedType] para mapear o campo tipo à classe concreta:

csharp
[JsonPolymorphic(TypeDiscriminatorPropertyName = "tipo")]
[JsonDerivedType(typeof(EnviarTodosUsuariosComando),                  "ENVIAR_TODOS_USUARIOS")]
[JsonDerivedType(typeof(EnviarClientesIntervaloComando),              "ENVIAR_CLIENTES_INTERVALO")]
[JsonDerivedType(typeof(EnviarTodosProdutosComando),                  "ENVIAR_TODOS_PRODUTOS")]
[JsonDerivedType(typeof(EnviarVendasIntervaloComando),                "ENVIAR_VENDAS_INTERVALO")]
[JsonDerivedType(typeof(EnviarPreVendasIntervaloComando),             "ENVIAR_PREVENDAS_INTERVALO")]
[JsonDerivedType(typeof(EnviarProdutosIntervaloComando),              "ENVIAR_PRODUTOS_INTERVALO")]
[JsonDerivedType(typeof(EnviarDevolucoesIntervaloComando),            "ENVIAR_DEVOLUCOES_INTERVALO")]
[JsonDerivedType(typeof(EnviarComprasIntervaloComando),               "ENVIAR_COMPRAS_INTERVALO")]
[JsonDerivedType(typeof(EnviarContraprovaVendasIntervaloComando),     "ENVIAR_CONTRAPROVA_VENDAS_INTERVALO")]
[JsonDerivedType(typeof(EnviarContraprovaDevolucoesIntervaloComando), "ENVIAR_CONTRAPROVA_DEVOLUCOES_INTERVALO")]
[JsonDerivedType(typeof(PararTudoComando),                            "PARAR_TUDO")]
public abstract class Comando
{
    [JsonPropertyName("id")]
    public int Id { get; set; }

    [JsonPropertyName("criadoEm")]
    public DateTime CriadoEm { get; set; }
}

Para deserializar a lista de comandos:

csharp
var opcoes = new JsonSerializerOptions { AllowOutOfOrderMetadataProperties = true };
var comandos = JsonSerializer.Deserialize<List<Comando>>(resposta.Content, opcoes);

AllowOutOfOrderMetadataProperties

Obrigatório para [JsonPolymorphic] funcionar corretamente com System.Text.Json.