web-dev-qa-db-fra.com

Utiliser GSON pour analyser un objet json avec un tableau json

J'ai un JSON qui est soit un objet unique, soit un tableau du même objet. Existe-t-il un moyen d’analyser ces données à l’aide de Gson, dans le but de faire la distinction entre un seul objet et un tableau?

La seule solution que j’ai actuellement pour cela est d’analyser manuellement le json et de l’entourer d’une capture d’essai. Je vais d’abord essayer de l’analyser en tant qu’objet unique. En cas d’échec, une exception sera lancée, puis de l’analyser comme un tableau.

Je ne veux pas analyser manuellement cependant ... cela me prendrait pour toujours. Voici une idée de ce qui se passe.

public class ObjectA implements Serializable{

    public String variable;
    public ObjectB[] objectb; //or ObjectB objectb;

    public ObjectA (){}
}

Voici l'objet qui peut être un tableau ou un seul objet.

public class ObjectB implements Serializable{

    public String variable1;
    public String variable2;

    public ObjectB (){}
}

Et ensuite, lors de l'interaction avec la réponse JSON. Je fais ça.

Gson gson = new Gson();
ObjectA[] objectList = gson.fromJson(response, ObjectA[].class);

Lorsque le tableau d'ObjectA est en cours de sérialisation, le JSON contient un tableau ou un objet unique pour ObjectB.

[
    {
        "variable": "blah blah",
        "objectb": {
            "variable1": "1",
            "variable2": "2"
        }
    },
    {
        "variable": "blah blah",
        "objectb": {
            "variable1": "1",
            "variable2": "2"
        }
    },
    {
        "variable": "blah blah",
        "objectb": [
            {
                "variable1": "1",
                "variable2": "2"
            },
            {
                "variable1": "1",
                "variable2": "2"
            }
        ]
    }
]
10
abounket

Je viens de changer ObjectB[] en List<ObjectB> en déclaration ObjectA.

ArrayList<ObjectA> la = new ArrayList<ObjectA>();
List<ObjectA> list = new Gson().fromJson(json, la.getClass());

for (Object a : list)
{
   System.out.println(a);
}

et voici mon résultat:

{variable=blah blah, objectb={variable1=1, variable2=2}}
{variable=blah blah, objectb={variable1=1, variable2=2}}
{variable=blah blah, objectb=[{variable1=1, variable2=2}, {variable1=1, variable2=2}]}

Je pense que dans l'ère des génériques, si vous n'avez pas de besoins particuliers, vous pouvez passer des tableaux aux listes, vous avez de nombreux avantages que Gson peut également utiliser pour effectuer une analyse syntaxique flexible.

8
giampaolo

Essayez d'utiliser com.google.gson.JsonParser.

        String jsonString = "object json representation";
        JsonParser jsonParser = new JsonParser();
        JsonElement jsonElement = jsonParser.parse(jsonString);

        if (jsonElement.isJsonArray()) {
            // some logic
        }

Il existe différentes manières d'obtenir votre objet à l'aide de l'instance JsonElement, par exemple, simplement à l'aide des méthodes com.google.gson.Gson:

public <T>  T fromJson(com.google.gson.JsonElement json, Java.lang.Class<T> classOfT) throws com.google.gson.JsonSyntaxException 

public <T>  T fromJson(com.google.gson.JsonElement json, Java.lang.reflect.Type typeOfT) throws com.google.gson.JsonSyntaxException

Alors, étudiez les classes JsonElement, JsonArray, JsonPrimitive, JsonNull et JsonObject. Croyez-en, ils ont une interface adéquate pour récupérer votre objet.

2
oleg.lukyrych

Pouvez-vous essayer de l'attraper en essayant d'abord d'analyser le tableau, puis de revenir à l'analyse de la classe d'objet unique?

Vous pouvez également faire un test simple et regarder le premier caractère non-blanc de la chaîne que vous desserrez, s'il s'agit d'un "{", il s'agit d'un seul objet, s'il s'agit d'un "[", c'est un tableau

0
Selecsosi