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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top