Gson:@Expose vs @SerializedName

时间:2016-01-12 19:28:01

标签: java android json gson

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

4 个答案:

答案 0 :(得分:64)

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

答案 1 :(得分:43)

即使是很晚,我也想回答这个问题。 为了解释它,我们必须知道什么是serializationdeserializationserialization正在将object转换为json string,而deserialization正在将json string转换为object

让我们说User类没有注释。

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

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

我们serialize如下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用于允许或禁止serializationdeserialization@Expose是可选的,它具有两个配置参数:serializedeserialize。默认情况下,它们设置为true。 对于serializedeserialize@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
}

答案 2 :(得分:11)

class Person{
String name;
String password;
}

如果我在没有 SerializedName 的情况下将i注释 Expose 放在变量名或密码之上,它将被序列化为AS变量名

但是,如果我们将 SerializedName (“用户名”)或(“密码”)置于其中,则会使用该键序列化< / p>

如果序列化

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

如果不是

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

答案 3 :(得分:5)

此外,@Expose comes with two boolean flagsfor annotation in annotationsToRemove { let pinView = mapView.view(for: annotation) UIView.animate(withDuration: 2, delay: 0, options: UIViewAnimationOptions.curveEaseOut, animations: { pinView?.alpha = 0.0 }, completion: { (finished: Bool) -> Void in self.mapView.removeAnnotation(annotation) }) } } deserialize允许跳过一个阶段的字段。