当前位置: 首页 > 知识库问答 >
问题:

ObjectMapper-如何将映射转换为POJO

仲孙信瑞
2023-03-14

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

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

测试代码:

@Test
public void testPOJOClass() {
    Map<String, String> map = new HashMap<>();
    map.put("String1", "string");
    map.put("Map1", "{\"key1\" : \"value1\", \"key2\":\"value2\", \"key3\" : null }");

    ObjectMapper mapper = new ObjectMapper();
    POJOClass pojoClass = mapper.convertValue(map, POJOClass.class);
}

例外:

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)

尝试的变体选项:

我知道我可以将map1字段也保留为String,然后使用另一个对象映射器实例将其转换为map,但我想避免它。有没有办法直接将测试代码中的字符串转换为提到的Pojo直接。

我甚至尝试将map1的类型从一个地图更改为另一个地图,但即使这样也没有成功。

共有1个答案

丁长卿
2023-03-14
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>>() {
    });
    }
}

您可以编写一个客户反序列化程序,在构造函数中的参数上注释JsonDeserialize(使用=CustomerDeserializer.class)@JsonProperty(value=“map1”,required=true)映射

 类似资料:
  • 现在,我正在使用ObjectMapper将映射转换为java中的POJO,下面是我的代码: 但结果POJO all属性为null。我试图调整POJO属性名称,并将POJO属性调整为对象类型,但仍然无法将值从映射转换为POJO。这是我的POJO定义: 这是现在的调试视图: 我应该怎么做才能修复它?

  • 我一直在研究Jackson,但似乎必须将映射转换为JSON,然后将生成的JSON转换为POJO。 有没有一种方法可以将地图直接转换成POJO?

  • 很抱歉重复了这个问题,但我的问题是其他的。我有一个从json-string解析到map的JSON解析器方法。但是json-string有一个值,这个值也是json-string。大概是这样的: 因此,我的解析方法: 我在客户端得到响应: ?但是随后我得到一个错误,IDE告诉我,是一个字符串。 那么,我如何用我的UserData获得这个LinkedHashMap呢?对不起,为了我的英语。谢谢你。

  • 我有以下代码,希望使用Java8将列表转换为。 当我尝试将列表中的单个值映射为映射的键时,我得到了一个错误。

  • 我试图在Go中创建一个泛型方法,该方法将使用来自< code > map[string]interface { } 的数据填充< code>struct。例如,方法签名和用法可能如下所示: 我知道使用JSON作为中介可以做到这一点;有没有其他更有效的方法?