Json Jackson Mapper通用地图类型问题

Mic*_*ght 2 java json jackson

这是我的第一个处理类型映射的titme,每次我尝试将节点映射到我的实际类型对象,其中自定义属性键为具有Set<Integer>值的FooType .这是我的对象的样子

public class Foo {
    private String some;
    Map<FooTypes,Set<Integer>> foos;

    public Map<FooTypes, Set<Integer>> getFoos() {
        return foos;
    }
    public void setFoos(Map<FooTypes, Set<Integer>> map) {
        this.foos = map;
    }
    public String getSome() {
        return some;
    }
    public void setSome(String some) {
        this.some = some;
    }
}

public class FooTypes {
    private String name;
    private String id;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我每次尝试使用mapper读取值: -

List <Foo> response = mapper.readValue("/home/foo/foo.json",List.class);

我得到一个错误说明: -

Can not find a (Map) Key deserializer for type [simple type, class cruft.FooTypes]

有人能告诉我如何解决这个问题?谢谢.

Json输出: -

{"foos":{"FooTypes [id=1, name=Test Foo]":[1,2,3]},"some":hello},{"foos":{"FooTypes [id=2, name=Another foo]":[5,6,7]}}
Run Code Online (Sandbox Code Playgroud)

Pas*_*nas 9

由于我们没有你要反序列化的Json结构,所以有点难以帮助你,但问题是杰克逊在将它用作地图键时不知道如何反序列化你的类.所有信息杰克逊都是一个简单的字符串,而你的类无法用一个字符串创建它.

有3种方法可以达到这个目的:

  1. 将单个字符串参数构造函数添加到FooType类
  2. 添加单个字符串参数工厂方法(静态)并使用@JsonCreator注释它
  3. 使用自定义KeyDeserializer并使用该foos字段注释@JsonDeserialize(keyUsing=YourDeserializer.class)

恕我直言静态工厂方法是更清洁的方式.