Сериализация и десериализация JSON в Gson Map<?, ?>

q20w26a

Разработчик
Инструктор
Пользователь
Сообщения
580
Решения
27
Мне нужно где-то сохранить данные моих объектов, и поскольку YAML слишком медленный, а прикручивать БД ради пары фич слишком затратно, мой выбор пал на Json, тем более что библиотека уже используется ядром.
Всё бы ничего, объект отлично сериализовался. Мне даже удалось его восстановить обратно. С проблемой же я столкнулся при сериализации и десериализации Map (HashMap'ы конкретнее).
Вам необходимо зарегистрироваться для просмотра изображений-вложений
Вам необходимо зарегистрироваться для просмотра изображений-вложений
В чём проблема? HashMap отлично сериализуется в JSON.
Вам необходимо зарегистрироваться для просмотра изображений-вложений
Зелёный - HashMap, красный - первый объект, синий - второй объект. Вместе это образует такой JSON.
Но обратно из этого JSON восстановить ничего не выходит. Либо HashMap получается пустым, либо содержит десериализованные объекты, которые тоже восстановить не выходит.
В втором случае Map.toString() выглядела так:
JavaScript:
{1={id=1.0, name=test}, 2={id=2.0, name=test-2}}
В голову мне пришла мысль, что вероятно мне нужно дополнительно десериализовывать помимо мапы еще и каждый объект в ней, таким образом я десериализовывал мапу, создавал вторую, пробегался циклом по первой, десериализовывал каждый объект в ней, отправляя его во вторую мапу, и возвращал её.
В итоге я пришел к следующему классу для обработки моих объектов:
Java:
public class GsonSerializer {
    public static String serializeObject(Object object) {
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        return gson.toJson(object, object.getClass());
    }

    public static Map<?, ?> deserializeMapWithObjects(String json, Class<?> objClass) {
        Map<?, ?> map = new Gson().fromJson(json, HashMap.class);
        Map<Integer, Object> map2 = new HashMap<Integer, Object>();
        for (int i = 1; i < map.size(); i++) {
            Object o = deserializeObject(json, objClass);
            map2.put(i, o);
        }
        return map2;
    }

    public static Object deserializeObject(String json, Class<?> clazz) {
        return new Gson().fromJson(json, clazz);
    }
}
Он, увы, не заработал, возвращая ту самую пустую мапу, состоящую из одних только скобок.
Java:
        String json = GsonSerializer.serializeObject(Radiostation.stations); // хешмапа с моими объектами
        p.sendMessage(json); // десериализованная хешмапа
        Map<?, ?> map = (Map<?, ?>) GsonSerializer.deserializeObject(json, HashMap.class); // восстанавливаю
        p.sendMessage(map.toString());
Получаю:
Вам необходимо зарегистрироваться для просмотра изображений-вложений

Java:
        String json = GsonSerializer.serializeObject(Radiostation.stations); // хешмапа с моими объектами
        p.sendMessage(json); // десериализованная хешмапа
        Map<?, ?> map = (Map<?, ?>) GsonSerializer.deserializeMapWithObjects(json, Radiostation.class); // восстанавливаю
        p.sendMessage(map.toString()); //
Получаю:
Вам необходимо зарегистрироваться для просмотра изображений-вложений


Сижу с 14-го числа над этой ошибкой, я без понятия уже что делать. Есть идеи?
 
mc923, спасибо, посмотрю. Хотел Jackson, но таскать его не очень охота было за собой ради пары небольших сохранений. Сейчас уже не надо, но в дальейшем я думаю пригодиться.
 
Назад
Сверху Снизу