Start Debugging
2023-09-21 Actualizado 2023-11-05 csharpdotnetdotnet-8 Edit on GitHub

.NET 8 deserializar en propiedades no públicas

Aprende a deserializar JSON en propiedades no públicas en .NET 8 usando el atributo JsonInclude y constructores parametrizados.

De forma similar a serializar a miembros no públicos, puedes deserializar en miembros no públicos proporcionando un constructor con parámetros que coincidan con los nombres de los miembros no públicos y anotando dichos miembros con el atributo JsonInclude.

Vayamos directamente a un ejemplo:

public class MyClass
{
    public MyClass(int privateProperty, int protectedProperty, int internalProperty)
    {
        PrivateProperty = privateProperty;
        ProtectedProperty = protectedProperty;
        InternalProperty = internalProperty;
    }

    [JsonInclude]
    private int PrivateProperty { get; }

    [JsonInclude]
    protected int ProtectedProperty { get; }

    [JsonInclude]
    internal int InternalProperty { get; }

    public int PublicProperty { get; set; }
}

Fíjate en que no hemos anotado PublicProperty de ninguna forma y tampoco la hemos incluido en el constructor. No es necesario, porque la propiedad es pública y tiene un setter público, así que se puede asignar después de crear la instancia del objeto.

Para probar la deserialización en el tipo definido arriba, podemos hacer esto:

string json = "{\"PrivateProperty\":1,\"ProtectedProperty\":2,\"InternalProperty\":3,\"PublicProperty\":4}";
var myObj = JsonSerializer.Deserialize<MyClass>(json);

Manejar múltiples constructores durante la deserialización

En caso de que tu clase tenga varios constructores, tendrás que guiar al deserializador hacia el correcto usando JsonConstructorAttribute.

public MyClass() { }

[JsonConstructor]
public MyClass(int privateProperty, int protectedProperty, int internalProperty)
{
    PrivateProperty = privateProperty;
    ProtectedProperty = protectedProperty;
    InternalProperty = internalProperty;
}

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Volver