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; }
}

无论我做什么,我都会打印一个空值,有什么想法吗?

4

3 回答 3

2

由于它是一个静态内部类。正如文档指出和评论的那样:

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

你可能想试试

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

此外,由于它是一个内部类,您可能需要更改 JSON 如果可以:

 {
   "site":{
      "A":"val1",
      "B":"val2",
      "C":"val3",
      "D":"val4",
      "E":"val5",
      "F":"val6",
      "G":"val7"
   }
}

如本文所述

于 2013-01-16T22:20:14.550 回答
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

于 2013-01-16T22:02:22.937 回答
0

根据文档,默认情况下会排除所有静态字段。按照链接中的示例更改默认排除策略,以便接受静态。

创建Gson对象时,请尝试以下操作:

Gson gson = new GsonBuilder()
    .excludeFieldsWithModifier(Modifier.TRANSIENT,Modifier.VOLATILE)
    .create();

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

于 2013-01-16T22:04:08.520 回答