【问题标题】:Unable to deserialize Json string to POJO (using GSON)无法将 Json 字符串反序列化为 POJO(使用 GSON)
【发布时间】:2011-08-26 20:59:12
【问题描述】:

知道为什么 JSON 不会映射到 java 对象吗?

代码..

String result = "{\"outerclass\":{\"innerclass\":{\"booleanA\":true,\"stringB\":\"b\",\"stringC\":\"c\"}}}\n";

Gson gson = new Gson();
TempObject o = gson.fromJson(result,TempObject.class);

POJO..

  public class TempObject {

     public static class outerclass {

      public static class innerclass {

       public static boolean booleanA;
       public static String stringB;
       public static String stringC;

      }    

     }

    }

其他例子..

String result = "{\"idata\":{\"result\":{\"error\":true,\"errorMessage\":\"Invalid username and/or password\",\"requestTime\":\"2011-08-26T18:39:02Z\"}}}"; 
Gson gson = new Gson();
UserData d = gson.fromJson(result, UserData.class);

类..

public class UserData {

    idata data;

    public static class idata {
        result res;

        public static class result {

            public boolean error;
            public String errorMessage;
            public String requestTime;
        }    
    }
}

【问题讨论】:

  • 您遇到什么错误或失败?
  • 没有错误信息。 o 为空,o.outerclass.innerclass.stringB 返回 null
  • 嗯,一切看起来都很好。您可能应该尝试编译代码(如上所述)并确保在您的真实代码中的某处没有任何小错字。也许把 \n 放在你的字符串末尾,它没有用。
  • 我添加了 \n 因为来自外部 API 的真实 JSON 响应在末尾有换行符。

标签: json gson deserialization


【解决方案1】:

如果我没记错的话,那是因为你的所有字段都是静态的,与每个单独的对象无关。

所以我认为这个类应该是这样的:

public class TempObject {

    Outerclass outerclass;

    public static class Outerclass {
        Innerclass innerclass;

        public static class Innerclass {

            public boolean booleanA;
            public String stringB;
            public String stringC;
        }    
    }
}

例如,在我的机器上,输出:

public class Example{
    public static void main(String[] args)  {
        String result = "{\"outerclass\":{\"innerclass\":{\"booleanA\":true,\"stringB\":\"b\",\"stringC\":\"c\"}}}\n";
        Gson gson = new Gson();
        TempObject o = gson.fromJson(result, TempObject.class);
        System.out.println(gson.toJson(o));
    }

    public static class TempObject {

        Outerclass outerclass;

        public static class Outerclass {
            Innerclass innerclass;

            public static class Innerclass {

                public boolean booleanA;
                public String stringB;
                public String stringC;
            }    
        }
    }
}

是:

{"outerclass":{"innerclass":{"booleanA":true,"stringB":"b","stringC":"c"}}}

【讨论】:

  • 那行不通。 TempObject 初始化,但 outerClass 为空。我尝试了许多静态/公共/私有的变体,并将类从内部类拉到单独的类中。我错过了关于 gson 的一些基本知识吗?
  • 我添加的代码(稍微编辑以匹配大小写)对我来说非常适合。见编辑。
  • 谢谢,但还是不行。对您来说,它将所有变量填充到 o?我的编译和运行没有错误,但实际上并没有对 o 做任何事情。
  • 查看编辑,为方便起见,我将 TempObject 类移动为内部类,没有这样做我得到了相同的结果。
  • 好的,这个例子对我有用,但是当我只改变类/变量名和输入字符串时,它就不再起作用了......在我原来的帖子中,我添加了实际的类和我正在尝试使用的代码。导致问题的任何变量名称或值有什么奇怪的地方吗?
【解决方案2】:

您无法反序列化,因为变量名称与您的 Json 中的键不匹配。在你的第二个例子中

String result = "{\"idata\":{\"result\":{\"error\":true,\"errorMessage\":\"Invalid username and/or password\",\"requestTime\":\"2011-08-26T18:39:02Z\"}}}"; 

idata data;
result res;

对象名称应与 JSON 中的键匹配,但不能与类名匹配。

IData idata; 结果结果

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-04
    • 2014-06-27
    • 2013-01-18
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    相关资源
    最近更新 更多