Сериализовать ArrayList <HashMap>через GSON - PullRequest
0 голосов
/ 07 мая 2020

У меня есть следующий код:

ArrayList<HashMap<String,String>> arr = new ArrayList<HashMap<String,String>>();
arr.add(new HashMap<String, String>(){{
        put("title","123");
        put("link","456");
}});
print(arr.toString());
print(new Gson().toJson(arr));

, и я получаю следующий результат:

[{link=456, title=123}]
[null]

Но я надеюсь, что это так:

[{link=456, title=123}]
[{"title":"123","link":"456"}] //Serialize ArrayList<HashMap> via GSON

I искал много сообщений, понятия не имею. спасибо за любой ответ.

Ответы [ 2 ]

0 голосов
/ 11 мая 2020

Используйте TypeToken, чтобы получить тип

Gson использует Java API отражения, чтобы получить тип объекта, для которого должен быть Json текст нанесен на карту. Но с дженериками эта информация теряется во время сериализации. Для решения этой проблемы Gson предоставляет класс com.google.gson.reflect.TypeToken для хранения типа объекта generi c.

Например:

ArrayList<HashMap<String, String>> arr = new ArrayList<>();
arr.add(new HashMap<String, String>() {{
    put("title", "123");
    put("link", "456");
}});
System.out.println(arr.toString());

Type type = new TypeToken<ArrayList<HashMap<String, String>>>() {}.getType();
System.out.println(new Gson().toJson(arr, type));

Вывод:

[{link=456, title=123}]
[{"link":"456","title":"123"}]
0 голосов
/ 11 мая 2020

Попробуйте какое-нибудь альтернативное решение, которое у меня есть.

  1. Первый использует только JsonObject и JsonArray из Gson пакета.
private static void toJsonElement(String title, String link) {
        JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("title", title);
        jsonObject.addProperty("link", link);
        JsonArray jsonArray = new JsonArray();
        jsonArray.add(jsonObject);
        System.out.println(jsonArray);
}
Использует JsonObject с ArrayList
private static void toArrayList(String title, String link) {
        JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("title", title);
        jsonObject.addProperty("link", link);
        List<JsonObject> listOfObject = new ArrayList<>();
        listOfObject.add(jsonObject);
        System.out.println(new Gson().toJson(listOfObject)); // listOfObject.toString() also works
}
...