使用Gson将JSON转换为Java对象

4

我正在使用GSON库来转换从Web服务中获取的JSON,但是我无法使其正常工作,我总是得到一个空值。我查看了类似于将Json转换为Java的问题,例如使用GSON进行简单的Json到Java转换,但仍然缺少某些内容。

JSON

{"A":"val1","B":"val2","C":"val3","D":"val4","E":"val5","F":"val6","G":"val7"}
         SiteWrapper m = gson.fromJson(json, SiteWrapper.class);

Java类

SiteWrapper m = gson.fromJson(json, SiteWrapper.class);
System.out.println(m.getMenu());

static class Site {
    static String A;
    static String B;
    static String C;
    static String D;
    static String E;
    static String F;
    static String G;

    public String toString() {
        return String.format(A,B,C,D,E,F,G);}

    public static String getA() {
        return A;
    }
    public static String getB() {
        return B;
    } 
... all the way to getG

    public void setA(String A) {
        Site.A = A;
    }
    public void setB(String B) {
        Site.B = B;
    }
... all the way to setB

和我的包装器

class SiteWrapper {
    private Site site;
    public Site getMenu() { return site; }
    public void setMenu(Site site) { this.site = site; }
}

无论我做什么都只打印出了null,有什么想法吗?

你是不是想说“设置setG”而不是“一直到setB”? - Jeff
3个回答

2

由于它是静态内部类。根据文档和评论所指出的:

同样,如果一个字段被标记为“静态”,默认情况下将被排除在外。如果您想包含一些短暂的字段...

你可以尝试

 Gson gson = new GsonBuilder()
    .excludeFieldsWithModifier()
    .create();

此外,由于它是一个内部类,您可能需要更改您的JSON。如果可以的话:
 {
   "site":{
      "A":"val1",
      "B":"val2",
      "C":"val3",
      "D":"val4",
      "E":"val5",
      "F":"val6",
      "G":"val7"
   }
}

正如在这个帖子中提到的那样


0
问题在于你的代码中,你传递了 SiteWrapper.class 而不是应该传递 Site.classgson.fromJSON
这一行:
SiteWrapper m = gson.fromJson(json, SiteWrapper.class);

应该是


Site s = gson.fromJSON(json, Site.class);

Site 是您为提供的 JSON 定义的类。 SiteWrapper 包含一个站点变量,您需要将此 Site 变量设置为 fromJSON 的结果。


虽然这肯定会导致问题,但单凭这个还不行。默认情况下将排除静态变量。 - rmlan

0
根据this文档,所有静态字段默认都被排除在外。请参考链接中的示例,修改默认排除策略以接受静态字段。
当您创建Gson对象时,请尝试以下操作:
Gson gson = new GsonBuilder()
    .excludeFieldsWithModifier(Modifier.TRANSIENT,Modifier.VOLATILE)
    .create();

这将创建一个 Gson 对象,默认情况下不会排除静态字段。


1
您需要对NuclearGhost的回答和我的建议都进行更改,才能使其正常工作。 - rmlan

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