0

我尝试在 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();
         }

问候克里斯

4

3 回答 3

2

尝试使您的构造函数公开,以便 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 对象“{..}”。您应该使用JSONArraywhich 期望“[...]”。

我试过了,它有效。您仍然应该License如上所述更改课程。

于 2010-11-23T08:04:20.723 回答
0

真是难以置信……

现在我试过了

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

但直接如此

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

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

它有效

于 2010-11-24T07:35:57.907 回答
-1

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

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

于 2013-01-27T08:38:43.323 回答