格森:@Expose vs @SerializedName

2022-08-31 10:54:02

关于Gson,和有什么区别?@Expose@SerializedName("stringValue")


答案 1

即使很晚了,我也想回答这个问题。为了解释它,我们必须知道什么是 和 。 正在转换为 和 正在转换为 。serializationdeserializationserializationobjectjson stringdeserializationjson stringobject

假设我们在没有注释的情况下上课。User

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

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

我们这个如下serializeobject

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用于允许或禁止 和 。 是可选的,它有两个配置参数:和 。默认情况下,它们设置为 true。To 和我们一起创建像这样的 gson 对象serializationdeserialization@Exposeserializedeserializeserializedeserialize@Expose

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

下面不会被反序列化。用户名的值将为 。userNamenull

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

下面不会序列化。userName

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

Json 字符串将如下所示。只有将被反序列化。userAge

{
    "age":30
}

答案 2

@SerializeName用于设置 json 对象将包含的键,但是用于决定是否为序列化和反序列化公开变量。以下是 的文档。@Expose@Expose