gson - > “带有数组的类xyz的无参数构造函数”

时间:2010-11-23 07:48:07

标签: android json gson

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

  

类xyz的No-args构造函数;不存在。使用Gson为此类型注册InstanceCreator以解决此问题

我尝试使用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,我必须剪掉第一个和最后一个字符(“[”和“]”) 根据{{​​3}},字符串与字符正确...:?:

代码如下:

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

问候克里斯

3 个答案:

答案 0 :(得分:2)

尝试将构造函数设为public,以便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课程。

答案 1 :(得分:0)

令人难以置信......

现在我尝试了不是这样

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

但直接如此

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

用我原来的旧json字符串开头和结尾“[”&amp; “]”

并且有效

答案 2 :(得分:-1)

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

删除了所有构造函数,对我来说工作正常。