GSON - ¿Cómo puedo analizar dos JSONArrays con el mismo nombre, pero con diferentes parámetros?

Brendan Wade Mahoney:

En la API Reddit JSON, los comentarios pueden contener dos tipos diferentes de JSONArrays, ambos llamados "niños".

"Niños" suele ser una matriz de objetos que contiene una cadena "tipo" y "datos" Objeto:

"children": [ { "kind": "t3", "data": {} } ...]

He estado bien el manejo de estos. Mi problema es que, a veces, los niños serán una matriz de cadena sencilla:

"children": [ "e78i3mq", "e78hees", "e78jq6q" ]

Al analizar estos, GSON lanza una excepción como la siguiente:

Causado por: java.lang.IllegalStateException: Se espera BEGIN_OBJECT pero fue CADENA en la línea 1 columna 3780 ruta $ [1] .data.children [0] [0] .data.replies.data.children .data.replies.data.children [0] [0] .data.replies.data.children .data.children [0]

¿Cómo puedo manejar estos casos matriz de cadenas?

Brendan Wade Mahoney:

Lo siento por el retraso en la respuesta, gracias por guiarme en la dirección correcta Emre!

Que terminó siendo GsonBuilder de trabajo con un método personalizado, getGsonAdaptedData.

Después de recuperar la respuesta JSON en un subproceso en segundo plano:

...
Gson gson = new GsonBuilder().registerTypeAdapter(Data.class, (JsonDeserializer<Data>) (arg0, arg1, arg2) -> {
        JsonObject dataJsonObject = arg0.getAsJsonObject();
        Data data = new Gson().fromJson(dataJsonObject, Data.class);
        return RedditUtils.getGsonAdaptedData(dataJsonObject.get("children").getAsJsonArray(), data);
    }).create();
    final Feed responseSubredditFeed = gson.fromJson(jsonString, Feed.class);
...

RedditUtils.getGsonAdaptedData

// JSON returned for Reddit comments can contain two types of arrays named "children"
// This method checks to see if we were given a Children array or String array
// JSON member "replies" is similar, and can be found in the Data of some Children
// If the method finds a nested "children" array, it recursively adapts its Data
public static Data getGsonAdaptedData(JsonArray childrenJsonArray, Data data) {

    if (childrenJsonArray.size() > 0) {

        Gson gson = new Gson();

        if (childrenJsonArray.get(0).isJsonObject()) {

            data.setChildrenList(gson.fromJson(childrenJsonArray,
                    new TypeToken<List<Children>>() {
                    }.getType()));

            // Loops through every Data object in the array looking for children and replies
            for (int i = 0; i < childrenJsonArray.size(); i++) {

                JsonObject nestedDataJsonObject = childrenJsonArray.get(i).getAsJsonObject().get("data").getAsJsonObject();

                if (nestedDataJsonObject.has("children")) {
                    getGsonAdaptedData(nestedDataJsonObject.get("children").getAsJsonArray(), data.getChildren().get(i).getData());

                } else if (nestedDataJsonObject.has("replies") && nestedDataJsonObject.get("replies").isJsonObject()) {

                    data.getChildren().get(i).getData().setRepliesObject(gson.fromJson(nestedDataJsonObject.get("replies"),
                            new TypeToken<Replies>() {
                            }.getType()));

                    getGsonAdaptedData(nestedDataJsonObject.get("replies").getAsJsonObject().get("data").getAsJsonObject().get("children").getAsJsonArray(), data.getChildren().get(i).getData());
                }
            }
        } else {

            data.setRepliesList(gson.fromJson(childrenJsonArray,
                    new TypeToken<List<String>>() {
                    }.getType()));
        }
    }

    return data;
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=213388&siteId=1
Recomendado
Clasificación