Gson: @Expose frente a @SerializedName

3 minutos de lectura

avatar de usuario
Ahmed Faisal

Con respecto a Gson cual es la diferencia entre @Expose y @SerializedName("stringValue")?

  • @MarkKeen, oye amigo, el enlace está roto.

    – iCantC

    26 de febrero de 2020 a las 10:52

  • enlace actualizado (otra búsqueda en Google) websystique.com/java/json/gson-json-anotaciones-ejemplo

    – Marca

    26 de febrero de 2020 a las 12:59

  • El valor predeterminado será verdadero si no especificamos ningún valor en la anotación Expose.

    –Chetan Gaikwad

    31 de enero a las 16:51


avatar de usuario
Bek

Aunque sea tarde, quería responder a esta pregunta. Para explicarlo debemos saber qué es serialization y deserialization.
serialization se está convirtiendo object dentro json string y deserialization se está convirtiendo json string dentro object.

digamos que hemos User clase sin anotaciones.

public class User{
    private String userName;
    private Integer userAge;

    public User(String name, Integer age){
        userName = name;
        userAge = age;
    }
}

Y nosotros serialize este object como a continuación

User user = new User("Ahmed", 30);
Gson gson = new Gson();
String jsonString = gson.toJson(user);

La cadena Json será así

{
    "userName":"Ahmed",
    "userAge":30
}

Si añadimos anotación @SerializedName

public class User{

    @SerializedName("name")
    private String userName;
    @SerializedName("age")
    private Integer userAge;

    public User(String name, Integer age){
        userName = name;
        userAge = age;
    }
}

La cadena Json será así

{
    "name":"Ahmed",
    "age":30
}

@Expose se usa para permitir o no permitir serialization y deserialization.
@Expose es opcional y tiene dos parámetros de configuración: serialize y deserialize. De forma predeterminada, están configurados como verdaderos. A serialize y deserialize con @Expose creamos un objeto gson como este

Gson gsonBuilder = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();

Abajo userName no será deserializado. el valor de nombre de usuario será null.

@SerializedName("name")
@Expose(deserialize = false)
private String userName;

Abajo userName no será serializado.

@SerializedName("name")
@Expose(serialize = false)
private String userName;

La cadena Json será así. Solamente userAge será deserializado.

{
    "age":30
}

  • @Kwnstantinos ¡Feliz de ayudarte!

    – Bek

    13 de junio de 2019 a las 4:16

  • Gracias. Cuando establecemos la serialización en falso, después de la serialización no veremos el nombre de usuario en la cadena json. Pero un momento. Supongamos que establecemos la deserialización del nombre de usuario en falso. Entonces, cuando deserialicemos nuestro json, obtendremos un nombre de usuario nulo. ¿Tengo razón?

    – Hayk Mkrtchyan

    1 oct 2019 a las 12:34

  • @Bek: Hermosa explicación

    – padreazrael

    7 de enero de 2020 a las 9:09

  • El valor predeterminado será verdadero si no especificamos ningún valor en la anotación Expose.

    –Chetan Gaikwad

    31 de enero a las 16:50


avatar de usuario
Gavriel

@SerializeName se usa para establecer la clave que incluirá el objeto json, sin embargo @Expose se utiliza para decidir si la variable será expuesta para serialización y deserialización o no. Aquí está la documentación de @Expose.

  • ¿Y si tuviéramos los dos? Expose y SerializeName?

    – Hamzeh Soboh

    10 de julio de 2018 a las 6:05

  • Expose está usando en casos raros y se puede quitar

    -Ali Rezaiyan

    26 de mayo de 2020 a las 7:46

  • @HamzehSoboh entonces dependerá de los valores pasados ​​en @Expose. (su sintaxis completa es @Expose(serialize = <true/false>,deserialize = <true/false>) donde true es el valor predeterminado para ambos.

    – ansh sachdeva

    26 de julio de 2020 a las 7:55

class Person{
String name;
String password;
}

supongo que si pongo una anotación Exponer encima de un nombre de variable o contraseña sin SerializedNamese serializará como nombre de variable

Pero si ponemos SerializedName me gusta (“nombre de usuario“) o (“clave“), se serializarán con esa clave

si serializado

{"username":"trinadh","password":"hello"}

que no

{"name":"trinadh","password":"hello"}

avatar de usuario
Shubham

Es más, @Expose viene con dos banderas booleanas: deserialize y serializepara permitir saltarse el campo durante una fase.

¿Ha sido útil esta solución?