2010-11-23 22 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で動作するようにしようとしたが、私はこの実行を取得できませんでした。 私があなたを助けてくれることを願っています。私は( "[" と "]")最初と最後の文字をカットする必要がgsonに従って

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" 
} 

]

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

それでも同じです。私はLicense []ではなく、Licenseでデシリアライズし、json文字列内にオブジェクトを1つだけ入れると動作します。 publicコンストラクタなしでも –

+0

なぜ 'j = new JSONObject(JSONSerializedResources)'を使うのですか? –

+0

これはgsonのチュートリアルの一部です –

0

それは信じられないです...

は今、私は、 "[" の開始と終了と私の古いオリジナルのJSON文字列ではないので、

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

ず、直接そう

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

を、それを試してみました& "]"

となります。

あなたは、私が二つのクラスのすべてのコンストラクタを削除し、クラスB

の クラスA持つリストを使用してみましたし、ちょうど私のためにうまく働い を必要としない場合

+0

ええ、私の答えに記載されているように、 'JSONObject'の代わりに' JSONArray'を使うべきです。 Gsonは両方をとるのに十分なほどスマートです。 –

0

は、コンストラクタを削除してください。

関連する問題