Сериализация Дженсона для карт со сложными ключами
Одна из возможностей, перечисленных на домашней странице Genson, - "Сериализация и десериализация карт со сложными ключами".
Пока я пытаюсь сериализовать карту с ключами в виде сложных java-объектов в строку json, а затем десериализовать их обратно в java Map. Десериализованные ключи карты всегда являются строками. Может кто-нибудь, пожалуйста, помогите мне, как использовать genson для такой сложной сериализации и десериализации карты ключей?
Вот мой код
Genson genson = new GensonBuilder().useClassMetadata(true).useRuntimeType(true).create();
VO vo = new VO();
Key key = new Key(18314212, new Timestamp(System.currentTimeMillis()),new Timestamp(System.currentTimeMillis()));
vo.setEndTime(new Timestamp(System.currentTimeMillis()));
vo.setStartTime(new Timestamp(System.currentTimeMillis()));
vo.setItemID(18314212);
vo.setKey(key);
Map<Object, Object> map = new HashMap<Object, Object>();
map.put(key, vo);
String json = genson.serialize(map);
System.out.println(json); //the json map key does not have @Class attribute
Map jsonMap = genson.deserialize(json, Map.class);
System.out.println(jsonMap);
1 ответ
Есть несколько вещей, которые вы должны знать, json не допускает ключи, которые не являются строками. Так что Генсон сделает одну из двух вещей:
- Если ключ какой-то базовый тип (например, примитив), он будет отображаться как строка
- Если ключ является сложным объектом, как в вашем случае, он будет выглядеть так: [{key:{}, значение: {}}]
Теперь кажется, что когда тип неизвестен, он будет использовать метод toString для ключа, я открыл здесь проблему.
Так что в вашем случае исправлением будет просто набрать карту следующим образом:
genson.serialize(m, new GenericType<Map<Key, Value>>(){});
genson.deserialize(json, new GenericType<Map<Key, Value>>(){});
Однако обратите внимание, что вам также необходимо отключить runtimeType в GensonBuilder. Потому что, когда вы включите его, он будет просто игнорировать определенный тип во время сериализации.