gson.fromJson返回null值

10

这是我的JSON字符串:"{'userName' : 'Bachooo'}"

将JSON字符串转换为LoginVO逻辑如下:

Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
LoginVO loginFrom  = gson.fromJson(jsonInString, LoginVO.class);
System.out.println("userName " + loginFrom.getUserName()); // output null

我的LoginVO.class是:

public class LoginVO {

 private String userName;
 private String password;

 public String getUserName()
 {
    return userName;
 }
 public void setUserName(String userName)
 {
    this.userName = userName;
 }
 public String getPassword()
 {
    return password;
 }
 public void setPassword(String password)
 {
    this.password = password;
 }

}

注意,我正在使用jdk 1.8.0_92

loginForm.getUserName()的输出是NULL而不是"Bachooo"。你对这个问题有什么想法吗?


如果你只使用 Gson gson = new Gson(),会发生什么? - OneCricketeer
如果我只使用Gson gson = new Gson(),则在递归调用com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)时会出现无限循环。 - PAncho
excludeFieldsWithoutExposeAnnotation 是什么意思?它的意思是“只暴露被注释的字段,忽略其余的字段”。 - Braj
可能是重复的问题,详见如何在JSON中转义字符串? - Siguza
'^' 即单引号不是有效的 JSON。' - Siguza
3个回答

8

如果您在 GsonBuilder 上设置了 excludeFieldsWithoutExposeAnnotation() 配置,则必须在要序列化/反序列化的字段上加上 @Expose 注释。

因此,为了让 excludeFieldsWithoutExposeAnnotation() 序列化/反序列化您的字段,您必须添加该注释:

@Expose
private String userName;
@Expose
private String password;

或者,您可以从GsonBuilder中删除excludeFieldsWithoutExposeAnnotation()


谢谢,兄弟,它百分之百有效。我需要@Expose将我的变量初始化。 - PAncho
1
另一种选择是,如果您无法编辑类,则只需使用new GsonBuilder().create()。 - Vikas Madhusudana

0

以下是解决该问题的方法。 在我的API中,使用了以下gson实现:

Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();

在我的测试中,我不得不使用相同的实现,在此之前gson无法解析属性。

因此,本质上要检查您在api/handler中配置的gson,并在测试中使用相同的配置。


-2

请尝试像这样。以下是示例类:

class AngilinaJoile {
    private String name;

    // setter

    // getter  
}

以下是使用Gson反序列化的方法:

Gson gson = new Gson();  
String jsonInString = "{'name' : 'kumaresan perumal'}";
AngilinaJoile angel = gson.fromJson(jsonInString, AngilinaJoile.class);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接