代码之家  ›  专栏  ›  技术社区  ›  lunicon

Jackson嵌套对象映射实现

  •  1
  • lunicon  · 技术社区  · 6 年前

    有没有办法告诉Jackson库在嵌套对象中使用whish映射实现? 我有一些从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 回复  |  直到 6 年前
        1
  •  1
  •   Benoit    6 年前

    必须添加一个 抽象类型映射 对象映射器。这是通过一个模块完成的:

    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");
        }
    }
    

    这将指示Jackson使用您的自定义类型 FieldsMap 每一次 Map 是需要的。

    输出为:

    Query unknown field c
    FieldsMap
    Query unknown field c