Java ObjectMapper-如何将映射转换为POJO

Java ObjectMapper-如何将映射转换为POJO,java,jackson,objectmapper,Java,Jackson,Objectmapper,我是java新手,正在努力学习objectmapper。我正在使用它将地图转换为pojo。映射中的键是string,所有值都是string值,除了一个我想转换为映射的值。 请仔细阅读下面的示例代码,以获得更清晰的图片 POJO类: import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import javax.annotation.No

我是java新手,正在努力学习objectmapper。我正在使用它将地图转换为pojo。映射中的键是string,所有值都是string值,除了一个我想转换为映射的值。 请仔细阅读下面的示例代码,以获得更清晰的图片

POJO类:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

import javax.annotation.Nonnull;
import java.util.Map;

public class POJOClass {
    private  String              string1;
    private Map<String, String> map1;

    @JsonCreator
    public POJOClass(@Nonnull @JsonProperty(value="String1", required = true) String string1,
                     @Nonnull @JsonProperty(value = "Map1", required = true) Map<String, String> map1) {
        this.string1 = string1;
        this.map1 = map1;
    }

    @Nonnull
    public String getString1() {
        return string1;
    }

    @Nonnull
    public Map<String, String> getMap1() {
        return map1;
    }
}
尝试了多种选项:

我知道我也可以将map1字段保留为字符串,然后使用另一个objectmapper实例将其转换为map,但我希望避免使用它。是否有任何方法可以直接将测试代码中的字符串转换为所提到的Pojo

我甚至尝试将map1的类型从一个映射更改为另一个映射,但即使这样也不起作用。

公共类CustomerDeserializer扩展了JsonDeserializer{
public class CustomerDeserializer extends JsonDeserializer<Map<String, String>> {

    @Override
    public Map<String, String> deserialize(final JsonParser p, final DeserializationContext ctxt) throws IOException, JsonProcessingException {
        final ObjectMapper mapper = (ObjectMapper) p.getCodec();
    return mapper.readValue(p.getText(), new TypeReference<Map<String, String>>() {
    });
    }
}
@凌驾 公共映射反序列化(final JsonParser p,final DeserializationContext ctxt)抛出IOException,JsonProcessingException{ final ObjectMapper mapper=(ObjectMapper)p.getCodec(); 返回mapper.readValue(p.getText(),newTypeReference()){ }); } }
您可以在构造函数中的
map1
参数上编写客户反序列化程序、注释JsonDeserialize
@JsonDeserialize(使用=CustomerDeserializer.class)
@JsonProperty(value=“Map1”,required=true)映射(Map1){

java.lang.IllegalArgumentException: Can not instantiate value of type [map type; class java.util.LinkedHashMap, [simple type, class java.lang.String] -> [simple type, class java.lang.String]] from String value ('{"key1" : "value1", "key2":"value2", "key3" : null }'); no single-String constructor/factory method
 at [Source: N/A; line: -1, column: -1]

    at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:3286)
    at com.fasterxml.jackson.databind.ObjectMapper.convertValue(ObjectMapper.java:3212)
public class CustomerDeserializer extends JsonDeserializer<Map<String, String>> {

    @Override
    public Map<String, String> deserialize(final JsonParser p, final DeserializationContext ctxt) throws IOException, JsonProcessingException {
        final ObjectMapper mapper = (ObjectMapper) p.getCodec();
    return mapper.readValue(p.getText(), new TypeReference<Map<String, String>>() {
    });
    }
}