【问题标题】:gson --> "No-args constructor for class xyz" with arraysgson --> 带有数组的“xyz 类的无参数构造函数”
【发布时间】:2011-05-14 07:41:04
【问题描述】:

我尝试在 gson 的帮助下反序列化一个 json 字符串。虽然 gson.fromJson 我收到以下错误:

类 xyz 的无参数构造函数;不存在。为这个类型注册一个 InstanceCreator 到 Gson 来解决这个问题

我尝试使用 InstanceCreate,但没有运行它。 我希望你能帮助我。

JSON 字符串

[
{
    "prog": "Name1",
    "name": "Name2",
    "computername": "Name3",
    "date": "2010-11-20 19:39:55"
},
{
    "prog": "Name1",
    "name": "Name2",
    "computername": "Name3",
    "date": "2010-11-20 12:38:12"
}

]

根据 gson 我必须剪切第一个和最后一个字符(“[”和“]”) 根据http://www.jsonlint.com/,字符串的字符正确... :?:

代码如下:

    public class License {
   public String prog;
   public String name;
   public String computername;
   public String date;

   public License() {
      this.computername = "";
      this.date = "";
      this.name = "";
      this.prog = "";
       // no-args constructor
   }
}

               String JSONSerializedResources = "json_string_from_above"
           try
         {
              GsonBuilder gsonb = new GsonBuilder();
              Gson gson = gsonb.create();

              JSONObject j;

              License[] lic = null;
              j = new JSONObject(JSONSerializedResources);

              lic = gson.fromJson(j.toString(), License[].class);

               for (License license : lic) {
                  Toast.makeText(getApplicationContext(), license.name + " - " + license.date, Toast.LENGTH_SHORT).show();
            }
         }
         catch(Exception e)
         {
            Toast.makeText(getApplicationContext(), "Error: " + e.getMessage(), Toast.LENGTH_LONG).show();
             e.printStackTrace();
         }

问候克里斯

【问题讨论】:

    标签: android json gson


    【解决方案1】:

    尝试将您的构造函数公开,以便 gson 可以实际访问它。

    public License() {
      this.computername = "";
      this.date = "";
      this.name = "";
      this.prog = "";
      // no-args constructor
    }
    

    但由于 Java 创建了一个默认构造函数,您可以使用:

    public class License {
        public String prog = "";
        public String name = "";
        public String computername = "";
        public String date = "";
    }
    

    更新:

    这真的很简单:JSONObject 需要一个 Json 对象“{..}”。你应该使用JSONArray,它需要“[...]”。

    我试过了,效果很好。您仍应如上所述更改 License 类。

    【讨论】:

    • 还是一样。当我不是在 License[] 上而是在 License 上反序列化并且只在 json 字符串中放入一个对象时,它可以工作。甚至没有公共构造函数
    • 你为什么用j = new JSONObject(JSONSerializedResources)
    • 这是 gson 教程的一部分
    【解决方案2】:

    难以置信……

    现在我试过了,不是这样

    j = new JSONObject(JSONSerializedResources);
    lic = gson.fromJson(j.toString(), License[].class);
    

    但直接如此

    lic = gson.fromJson(JSONSerializedResources, License[].class);
    

    用我的旧原始 json 字符串开始和结束“[”和“]”

    它可以工作

    【讨论】:

    • 是的,如我的回答中所述 - 如果 JSONObject,您应该使用 JSONArray 而不是。 Gson 很聪明,可以两者兼得。
    【解决方案3】:

    如果不需要,请尝试删除构造函数 我尝试使用两个类 A 类具有 B 类列表

    删除了所有的构造函数,对我来说效果很好。

    【讨论】:

    • 这对答案有何贡献?
    猜你喜欢
    • 1970-01-01
    • 2011-05-07
    • 2018-06-03
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 2015-02-03
    相关资源
    最近更新 更多