web-dev-qa-db-ja.com

Gson:@Expose vs @SerializedName

Gsonに関して、_@Expose_と@SerializedName("stringValue")の違いは何ですか?

46
Ahmed

@SerializeNameは、jsonオブジェクトに含めるキーを設定するために使用されますが、@Exposeは、変数をSerializationおよびDeserialisationに公開するかどうかを決定するために使用されます。 ここにあります@Expose

70
Gavriel

遅くても、この質問に答えたいと思いました。それを説明するには、serializationおよびdeserializationとは何かを知る必要があります。 serializationobjectjson stringに変換し、deserializationjson stringobjectに変換しています。

注釈のないUserクラスがあるとします。

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

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

そして、以下のserialize this object

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

JSON文字列は次のようになります

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

注釈を追加する場合@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文字列は次のようになります

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

@Exposeは、serializationおよびdeserializationを許可または禁止するために使用されます。 @Exposeはオプションで、serializedeserializeの2つの構成パラメーターがあります。デフォルトでは、それらはtrueに設定されています。 serializeおよびdeserialize@Exposeを指定するには、次のようなgsonオブジェクトを作成します

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

以下のuserNameは逆シリアル化されません。 userNameの値はnullになります。

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

以下のuserNameはシリアル化されません。

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

JSON文字列は次のようになります。 userAgeのみが逆シリアル化されます。

{
    "age":30
}
66
Bek
class Person{
String name;
String password;
}

SerializedNameを使用せずに変数名またはパスワードの上にi注釈Exposeを追加すると、AS変数名がシリアル化されます

しかし、SerializedName like( "sername")または( "password")を入力すると、それらはそのキーでシリアル化されます

シリアル化されている場合

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

そうでない場合

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

また、 @Exposeには2つのブールフラグが付いていますdeserializeおよびserialize。1つのフェーズでフィールドをスキップできます。

4
Shubham