0
votes

Comment désérialiser un tableau de différents types avec GSON

Premièrement, je sais qu'il y a beaucoup de questions sur ce sujet, mais je n'ai pas pu en trouver une qui résout mon problème.

Je dois désérialiser avec Gson un json qui se présente sous cette forme:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY

J'ai implémenté les classes:

Entries ent = new Gson().fromJson(json, Entries.class);

Je désérialise avec:

class Entries
{
    String name;
    ArrayList<Entry> entries;
}

class Entry
{
    String name;
    Details details;
}

class Details
{
    Boolean is_ok;
    String type;
}

Et j'obtiens cette erreur:

{
  "name": "abc",
  "entries":
  [
    [
      "first_entry_name",
      {"is_ok": true, "type": "first_entry_type"}
    ],
    [
      "second_entry_name",
      {"is_ok": false, "type": "second_entry_type"}
    ]
  ]
}

Je comprends pourquoi j'obtiens cette erreur mais je n'arrive pas à trouver un moyen de désérialiser ce json. P >

Comment ce json doit-il être désérialisé?


0 commentaires

5 Réponses :


0
votes

Je ne suis pas vraiment sûr que cela aide, je viens du monde c #. mais je pense que ce sera un problème générique, alors essayez de convertir votre instance (ent) d'un objet à un tableau ou une liste de ce type ..

Je veux dire comme ça

cette syntaxe c # mais je pense il y a la plupart du temps la même chose avec java

<List>Entries ent = (<List>Entries)new Gson().fromJson(json, Entries.class);

ça peut être aussi ici Array mais List est plus dynamique .. j'espère que ça marche


0 commentaires

2
votes

Le code est correct mais votre fichier JSON devrait être comme ci-dessous

 {
   "name": "abc",
   "entries":
   [
    {
      "first_entry_name":{"is_ok": true, "type": "first_entry_type"}
    },
    {
      "second_entry_name":{"is_ok": false, "type": "second_entry_type"}
    }
   ]
 }

Dans le json posté dans la question d'origine, il y avait une liste à l'intérieur d'une liste (entrées) mais idéalement, il devrait s'agir d'un élément json à l'intérieur une liste.

Voici la capture d'écran du code avec sortie

 entrez la description de l'image ici

J'espère que cela vous aidera p >


1 commentaires

Malheureusement, je ne suis pas en mesure de modifier le json. J'ai besoin d'un code pour le désérialiser.



0
votes

Vous pouvez faire quelque chose comme ci-dessous.

essayez d'ajouter une autre classe wrapper car j'ai ajouté un exemple ici en tant que EntryTwo.

class Entries
{
    String name;
    ArrayList<Entry> entries;
}

class Entry
{
   ArrayList<EntryTwo> entryTwo;

}
class EntryTwo
{
 String name;
 Details details;
}

class Details
{
    Boolean is_ok;
    String type;
}

J'espère que cela fonctionne ... p>


0 commentaires

0
votes

Vous devez implémenter un désérialiseur personnalisé pour le type List :

class Entries {
    String name;

    @JsonAdapter(EntriesJsonDeserializer.class)
    List<Entry> entries;
}

Vous pouvez l'enregistrer en utilisant l'annotation JsonAdapter :

class EntriesJsonDeserializer implements JsonDeserializer<List<Entry>> {

    @Override
    public List<Entry> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        JsonArray array = json.getAsJsonArray();
        List<Entry> entries = new ArrayList<>(array.size());
        for (JsonElement item : array) {
            JsonArray itemArray = item.getAsJsonArray();
            entries.add(parseEntry(context, itemArray));
        }

        return entries;
    }

    private Entry parseEntry(JsonDeserializationContext context, JsonArray array) {
        Entry entry = new Entry();
        entry.setName(array.get(0).getAsString());
        entry.setDetails(context.deserialize(array.get(1), Details.class));

        return entry;
    }
}


0 commentaires

0
votes

Vous pouvez essayer le code suivant:

public class Entries {

    private String name;
    private List<List<String>> entries;
    public void setName(String name) {
         this.name = name;
     }
     public String getName() {
         return name;
     }

    public void setEntries(List<List<String>> entries) {
         this.entries = entries;
     }
     public List<List<String>> getEntries() {
         return entries;
     }

}


0 commentaires