gson -> « constructeur Pas-args pour la classe xyz » avec les tableaux
Question
i essaie de désérialiser une chaîne JSON avec l'aide de gson. Alors que gson.fromJson je reçois l'erreur suivante:
Non-args constructeur pour xyz classe; n'existe pas. Inscrivez-vous un InstanceCreator avec Gson pour ce type de résoudre ce problème
J'ai essayé de travailler avec un InstanceCreate mais je n'ai pas cette course. J'espère que vous pouvez me aider.
JSON chaîne
[
{
"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"
}
]
selon gson je découper les premier et dernier caractères ( « [ » et « ] ») selon http://www.jsonlint.com/ la chaîne est avec les caractères corriger ...:? :
les regards de code comme ça:
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();
}
Chris considère
La solution
Essayez de faire votre public constructeur, de sorte que gson peut réellement y accéder.
public License() {
this.computername = "";
this.date = "";
this.name = "";
this.prog = "";
// no-args constructor
}
mais depuis Java crée un constructeur par défaut, vous pouvez simplement utiliser:
public class License {
public String prog = "";
public String name = "";
public String computername = "";
public String date = "";
}
Mise à jour:
Il est vraiment trivial: JSONObject
attend un objet JSON "{..}". Vous devez utiliser JSONArray
qui attend "[...]".
Je l'ai essayé et il fonctionne. Vous devriez toujours changer de classe de License
comme indiqué ci-dessus.
Autres conseils
il est incroyable ...
je l'ai essayé pas
j = new JSONObject(JSONSerializedResources);
lic = gson.fromJson(j.toString(), License[].class);
mais directement si
lic = gson.fromJson(JSONSerializedResources, License[].class);
avec ma chaîne JSON originale avec début et de fin « [ » et « ] »
et il fonctionne
Essayez de supprimer les constructeurs si vous n'avez pas besoin J'ai essayé d'utiliser deux classes Classe A ayant liste de classe B
Removed tous les constructeurs et tout a bien fonctionné pour moi.