2010-11-23 73 views
0

我嘗試在gson的幫助下反序列化json字符串。雖然gson.fromJson我得到以下錯誤:gson - >「類xyz的無參數構造函數」與數組

No-args constructor for class xyz; does not exist. Register an InstanceCreator with Gson for this type to fix this problem

我試圖使用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(); 
     } 

認爲克里斯

回答

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對象「{..} 」。你應該使用JSONArray其中預計「[...]」。

我試過了,它的工作原理。如上所述,您仍然應該更改License班。

+0

它仍然是一樣的。當我反序列化不是在許可證[],而是在許可證上,並且只將一個對象放入json字符串中。甚至沒有公共構造函數 – 2010-11-23 08:15:30

+0

爲什麼你使用`j = new JSONObject(JSONSerializedResources)`? – 2010-11-23 09:12:07

0

這是令人難以置信......

現在我想它不是那麼

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

而是直接使

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

與我原來的老JSON字符串有開始和結束 「[」 &「]」

它工作

0

嘗試刪除構造函數,如果你不需要 我試着用兩個類 有乙

類的列表中刪除所有構造函數A類和只是工作對我很好。

相關問題