Я новичок в 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 также как строку, а затем преобразовать его в карту, используя другой экземпляр объекта сопоставления, но я хочу избежать этого. Есть ли способ напрямую преобразовать строку в тестовом коде в упомянутый Pojo напрямую.
Я даже попытался изменить тип map1 с карты на карту, но даже это не сработало.