Джексон: реализация вложенной карты объектов - PullRequest
0 голосов
/ 23 ноября 2018

Есть ли способ сообщить Джексону библиотеке, какую реализацию Map использовать во вложенном объекте?

У меня есть карта, расширенная из HashMap, меня не волнует порядок полей:

public class FieldsMap<K, V> extends HashMap<K, V> {

  @Override
  public V get(Object field) {
    V value = super.get(field);
    if (value == null && !containsKey(field)) {
        log.warn("Query unknown field " + field);
    }

    return value;
  }

}


И ObjectMapper.readValue() возвращает этот класс:

final TypeReference<FieldsMap<String, Object>> mapType =
    new TypeReference<FieldsMap<String, Object>>() {};

Map<String, Object> res = new ObjectMapper().readValue("{\"a\": {\"b\": 0}}", mapType);
res.get("c"); // warning

Но вложенный объект всегда LinkedHashMap:

System.out.println(res.get("a").getClass().getName()); // java.util.LinkedHashMap
((Map)res.get("a")).get("c"); // no warning

Это будет полезно в тестовых средах.

1 Ответ

0 голосов
/ 28 ноября 2018

Вы должны добавить отображение абстрактного типа в ваш ObjectMapper.Это делается с помощью модуля:

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class FieldsMap<K, V> extends HashMap<K, V> {

    @Override
    public V get(Object field) {
        V value = super.get(field);
        if (value == null && !containsKey(field)) {
            System.out.println("Query unknown field " + field);
        }
        return value;
    }

    public static void main(String [] args) throws IOException {
        final TypeReference<FieldsMap<String, Object>> mapType = new TypeReference<FieldsMap<String, Object>>() {};
        ObjectMapper objectMapper = new ObjectMapper();
        SimpleModule module = new SimpleModule().addAbstractTypeMapping(Map.class, FieldsMap.class);
        objectMapper.registerModule(module);
        Map<String, Object> res = objectMapper.readValue("{\"a\": {\"b\": 0}}", mapType);
        res.get("c");
        System.out.println(res.get("a").getClass().getName());
        ((Map)res.get("a")).get("c");
    }
}

Это будет указывать Джексону использовать ваш пользовательский тип FieldsMap каждый раз, когда требуется Map.

Вывод:

Query unknown field c
FieldsMap
Query unknown field c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...