Gson: @Expose vs @SerializedName

Antworten:

161

Auch wenn es spät ist, wollte ich diese Frage beantworten. Um es zu erklären, müssen wir wissen, was ist serializationund deserialization. serializationkonvertiert objectin json stringund deserializationkonvertiert json stringin object.

Nehmen wir an, wir haben eine UserKlasse ohne Anmerkungen.

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

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

Und wir serializedies objectwie unten

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

Json String wird so sein

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

Wenn wir Anmerkungen hinzufügen @SerializedName

public class User{

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

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

Json String wird so sein

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

@Exposewird verwendet, um zuzulassen oder zu verbieten serializationund deserialization. @Exposeist optional und hat zwei Konfigurationsparameter: serializeund deserialize. Standardmäßig sind sie auf true gesetzt. Zu serializeund deserializemit @Exposeerstellen wir ein solches gson-Objekt

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

Unten userNamewird nicht deserialisiert. Der Wert von userName lautet null.

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

Unten userNamewird nicht serialisiert.

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

Json String wird so sein. Nur userAgewird deserialisiert.

{
    "age":30
}
Bek
quelle
1
@Kwnstantinos Gerne helfen wir Ihnen!
Bek
Vielen Dank. Wenn wir die Serialisierung auf false setzen, wird nach der Serialisierung der Benutzername in der JSON-Zeichenfolge nicht angezeigt. Aber einen Moment. Nehmen wir an, wir setzen die Deserialisierung des Benutzernamens auf false. Wenn wir also unseren JSON deserialisieren, erhalten wir den Benutzernamen null. Habe ich recht?
Hayk Mkrtchyan
@Bek: Schöne Erklärung
Fatherazrael
89

@SerializeNamewird verwendet, um den Schlüssel @Exposefestzulegen, den das JSON- Objekt enthalten soll. Es wird jedoch verwendet, um zu entscheiden, ob die Variable für die Serialisierung und Deserialisierung verfügbar gemacht wird oder nicht. Hier ist die Dokumentation von @Expose.

Gavriel
quelle
42
Was wäre, wenn wir beide Exposeund hätten SerializeName?
Hamzeh Soboh
1
Exposewird in seltenen Fällen verwendet und kann entfernt werden
Ali Rezaiyan
@HamzehSoboh dann hängt es von den übergebenen Werten ab @Expose. (seine vollständige Syntax ist @Expose(serialize = <true/false>,deserialize = <true/false>), wobei true für beide Standard ist.
ansh sachdeva
13
class Person{
String name;
String password;
}

Angenommen, wenn ich i annotation Expose über einen Variablennamen oder ein Kennwort ohne SerializedName setze , wird es als Variablenname serialisiert

Wenn wir jedoch SerializedName wie (" Benutzername ") oder (" Passwort ") eingeben , werden sie mit diesem Schlüssel serialisiert

wenn serialisiert

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

wenn nicht

{"name":"trinadh","password":"hello"}
Trinadh Koya
quelle