为什么GSON 只使用字段(私有,公共,受保护)?有没有办法告诉GSON只使用getter和setter?
Gson用户指南声明我们应该为任何类定义默认的no-args构造函数以正确使用Gson.更重要的是,在Gson 类的javadoc中,InstanceCreator如果我们尝试反序列化缺少默认构造函数的类的实例,那么将抛出异常,我们应该InstanceCreator在这种情况下使用.但是,我尝试使用缺少默认构造函数的类来测试使用Gson,并且序列化和反序列化工作都没有任何问题.
这是deserializaiton的一段代码.没有非args构造函数的类:
public class Mushroom {
private String name;
private double diameter;
public Mushroom(String name, double diameter) {
this.name = name;
this.diameter = diameter;
}
//equals(), hashCode(), etc.
}
Run Code Online (Sandbox Code Playgroud)
和测试:
@Test
public void deserializeMushroom() {
assertEquals(
new Mushroom("Fly agaric", 4.0),
new Gson().fromJson(
"{name:\"Fly agaric\", diameter:4.0}", Mushroom.class));
}
Run Code Online (Sandbox Code Playgroud)
哪个工作正常.
所以我的问题是:我是否真的可以使用Gson而不需要默认构造函数,或者在任何情况下它都不起作用?
public class UserAction {
private final UUID uuid;
private String userId;
/* more fields, setters and getters here */
public UserAction(){
this.uuid = UUID.fromString(new com.eaio.uuid.UUID().toString());
}
public UserAction(UUID uuid){
this.uuid = uuid;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final UserAction other = (UserAction) obj;
if (this.uuid != other.uuid && (this.uuid == null || !this.uuid.equals(other.uuid))) {
return false;
}
return true;
}
@Override
public …Run Code Online (Sandbox Code Playgroud) 我不想定义一个额外的类型只是为了进行json转换。我使用的库需要一个对象作为输入,然后对该数据执行http操作,因此无法使用硬编码的json字符串作为输入。
private static final Gson GSON = new Gson();
public static void main(String[] args) {
System.out.println(GSON.toJson(new Object() {
private String email_address = "me@mail.eu";
public String getEmail_address() {return "me@mail.eu"; }
public void setEmail_address(String mail) {email_address = mail; }
}));
}
Run Code Online (Sandbox Code Playgroud)
我试图删除getter和setter或离开getter并删除字段,但是它不起作用。有人知道如何解决这个问题吗?