Java Jackson:嵌套对象映射实现

Java Jackson:嵌套对象映射实现,java,jackson,Java,Jackson,有没有办法告诉库在嵌套对象中使用哪个映射实现 我有一些从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)) {

有没有办法告诉库在嵌套对象中使用哪个映射实现

我有一些从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;
  }

}
但是嵌套对象总是
LinkedHashMap

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

它在测试环境中会很有帮助。

您必须向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");
    }
}

您的json是嵌套json,并且总是嵌套json与键值对一起,并被视为
Map
我的意思是json树中的子对象,在我的示例中是元素“a”。需要一个您不知道树的comon解决方案structure@lunicon这很奇怪,因为它确实对我有用。我复制了与你提供的完全相同的样品。您使用什么版本的Jackson?依赖项'com.fasterxml.Jackson.core:Jackson-core:2.4.2'。也许我用错了。你能提供全价吗example@lunicon我用一个完整的工作示例更新了我的答案。我认为错误在类内部使用。否,此功能是在更高版本中添加的。。顺便说一下,谢谢
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");
    }
}
Query unknown field c
FieldsMap
Query unknown field c