Можно ли преобразовать массив пар объектов в Map
, выбрав значения из каждой пары, не создавая промежуточный POJO?
Например, скажем, что есть 2 Java
класса (Key.class
, Value.class
) и массив JSON
, построенный из сериализованных пар их объектов, следующим образом
[
{"key":{}, "value":{}}, // Objects k1, v1
{"key":{}, "value":{}}, // Objects k2, v2
{"key":{}, "value":{}}, // Objects k3, v3
{"key":{}, "value":{}}, // Objects k4, v4
]
Может Gson
«напрямую» (т. Е. Без определения POJO) десериализовать вышеуказанный массив в Map
, в котором фактические ключи и значения заполняются из манипуляций с соответствующими Key
и Value
объекты, а не "полные" объекты?
Другими словами, учитывая два Java
типа K
и V
, которые могут отличаться от Key
и Value
, десериализация на пару должна составлять
(k1:Key, v1:Value) --> (k1':K, v1':V)
, где
k1' = function(k1)
v1' = function(v1)
Адаптер, подобный этому, не работает:
GsonBuilder builder = new GsonBuilder();
Type type = (new TypeToken<Map<K, V>>() {}).getType();
builder.registerTypeAdapter(type, new JsonDeserializer<Map<Key, Value>>() {
@Override
public Map<K, V> deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
// Custom deserialization block,
// invoking the `function()` method
}
Gson gson = builder.create();
Использование вышеприведенного адаптера приводит к Gson
передаче всего массива в метод deserialize()
, где им нужно манипулировать вручную, что утомительно и подвержено ошибкам.
С пользовательским POJO
как
public class KeyValue {
Key k;
Value v;
}
вышеуказанный массив JSON
может быть десериализован в массив или набор KeyValue
объектов, которые затем могут быть преобразованы в Map<K, V>
. Но можно ли сделать то же самое без KeyValue
POJO;