Как использовать Gson для анализа файла JSON, который содержит массивы - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь прочитать файл JSON из этого URL-адреса, используя ion , библиотеку для Android и Gson.

Файл JSON в его текущем состоянии:

{
    "Excited":["https://github.com/vedantroy/image-test/raw/master/Happy/excited1.gif",
                "https://github.com/vedantroy/image-test/raw/master/Happy/excited2.gif",
                "https://github.com/vedantroy/image-test/raw/master/Happy/excited3.gif"],

    "Sad":["https://github.com/vedantroy/image-test/raw/master/Sad/sad1.gif",
            "https://github.com/vedantroy/image-test/raw/master/Sad/sad2.gif",
            "https://github.com/vedantroy/image-test/raw/master/Sad/sad3.gif",
            "https://github.com/vedantroy/image-test/raw/master/Sad/sad4.gif"]

}

Важное примечание : Хотя сейчас файл JSON имеет два массива: «Excited» и «Sad», в будущем он может иметь больше массивов.Однако базовая структура файла всегда будет серией JSON-массивов.

Моя цель - преобразовать этот объект JSON, содержащий два (но может быть больше) массива, в список списков.

Вот мой код, он анализирует URL-адрес и возвращает Gson JsonObject с именем "result":

Ion.with(applicationContext)
                .load("https://raw.githubusercontent.com/vedantroy/image-test/master/index.json")
                .asJsonObject()
                .setCallback { e, result ->
                    //Do something...
                }

Этот код также можно записать в виде:

Ion.with(applicationContext)
                .load("https://raw.githubusercontent.com/vedantroy/image-test/master/index.json")
                .asJsonObject()
                .setCallback(object : FutureCallback<JsonObject> {
                    override fun onCompleted(e: Exception?, result: JsonObject?) {
                        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
                    }

                })

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Если вы можете изменить этот JSON, я бы использовал что-то вроде этого, для меня это проще для сериализации / десериализации и выглядит более семантическим (и это JSON Array, JSON, который вы отправляете, является просто JSON Object)

[{
    "mood": "Excited",
    "gifs": ["https://github.com/vedantroy/image-test/raw/master/Happy/excited1.gif",
        "https://github.com/vedantroy/image-test/raw/master/Happy/excited2.gif",
        "https://github.com/vedantroy/image-test/raw/master/Happy/excited3.gif"
    ]
},

{
    "mood": "Sad",
    "gifs": ["https://github.com/vedantroy/image-test/raw/master/Sad/sad1.gif",
        "https://github.com/vedantroy/image-test/raw/master/Sad/sad2.gif",
        "https://github.com/vedantroy/image-test/raw/master/Sad/sad3.gif",
        "https://github.com/vedantroy/image-test/raw/master/Sad/sad4.gif"
    ]
}
]

Используя этот JSON, вы можете десериализовать как это в Java, так что вам придется адаптироваться к Kotlin, используя библиотеку Ion

import java.util.ArrayList;
import java.util.List;

import org.json.JSONArray;

import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;

public class Deserializer {

    public static void main(String[] args) {
       JSONArray json = new JSONArray(
            "[{\"mood\": \"Excited\",\"gifs\": [\"https://github.com/vedantroy/image-test/raw/master/Happy/excited1.gif\",\"https://github.com/vedantroy/image-test/raw/master/Happy/excited2.gif\",\"https://github.com/vedantroy/image-test/raw/master/Happy/excited3.gif\"]},{\"mood\": \"Sad\",\"gifs\": [\"https://github.com/vedantroy/image-test/raw/master/Sad/sad1.gif\",\"https://github.com/vedantroy/image-test/raw/master/Sad/sad2.gif\",\"https://github.com/vedantroy/image-test/raw/master/Sad/sad3.gif\",\"https://github.com/vedantroy/image-test/raw/master/Sad/sad4.gif\"]}]");
       Gson gson = new Gson();
       List<YourObject> test = gson.fromJson(json.toString(), new TypeToken<ArrayList<YourObject>>() {}.getType());
       test.forEach(System.out::println);
    }

    public static class YourObject {

        private String mood;
        private List<String> gifs;

        @Override
        public String toString() {
            return this.mood.toString() + " " + this.gifs.toString();
       }
    }
}
0 голосов
/ 18 мая 2018

Переберите JsonObject entrySet и добавьте каждый JsonArray в список, я использую мой код Java, вы можете преобразовать его в Kotlin, если необходимо:

ArrayList<JsonArray> result = new ArrayList<>();
for (Map.Entry<String, JsonElement> entry : resultJson.entrySet()) {
    if (entry.getValue().isJsonArray()) {
        result.add(entry.getValue().getAsJsonArray());
    }
}
...