[英]ObjectMapper - How to convert a Map to POJO
我是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的類型從Map更改為Map,但即使這樣也不起作用。
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(using = CustomerDeserializer.class) @JsonProperty(value = "Map1", required = true) Map<String, String> map1) {
map1
參數上注釋JsonDeserialize @JsonDeserialize(using = CustomerDeserializer.class) @JsonProperty(value = "Map1", required = true) Map<String, String> map1) {
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.