converValue
метод используется для преобразования объектов. См JavaDoc
:
удобный метод для двухэтапного преобразования из заданного значения,
в экземпляр данного типа значения, если (но только если!) преобразование
необходимо. Если данное значение уже имеет запрошенный тип, возвращается значение
как есть. Этот метод функционально похож на первую сериализацию
значение в JSON, а затем привязать данные JSON к значению данного типа,
но должен быть более эффективным, поскольку полная сериализация не
происходить. Тем не менее, те же конвертеры (сериализаторы, десериализаторы) будут
использоваться как для привязки данных, то есть для конфигурации объекта сопоставления объектов
работы.
Например, вы можете «конвертировать» File
в String
следующим образом:
mapper.convertValue(jsonFile, String.class)
Где jsonFile
- это экземпляр класса File
. Пример результата может быть: path/to/json
.
Для десериализации JSON
полезных данных используйте один из readValue
методов семейства.
Вы можете создать свой POJO
с аннотированным конструктором JsonCreator
:
class Pojo {
private final Map<String, SubPojo> map;
@JsonCreator
public Pojo(Map<String, SubPojo> map) {
this.map = map;
}
public Map<String, SubPojo> getMap() {
return map;
}
@Override
public String toString() {
return "Pojo{" +
"map=" + map +
'}';
}
}
class SubPojo {
private Map<String, String> map;
@JsonCreator
public SubPojo(Map<String, String> map) {
this.map = map;
}
@Override
public String toString() {
return "SubPojo{" +
"map=" + map +
'}';
}
}
И простое использование. Для чтения JSON
из файла используйте readValue
метод:
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.util.Map;
public class JsonApp {
public static void main(String[] args) throws Exception {
File jsonFile = new File("./resource/test.json").getAbsoluteFile();
ObjectMapper mapper = new ObjectMapper();
Pojo map = mapper.readValue(jsonFile, Pojo.class);
System.out.println(map);
}
}
Над кодом напечатано:
Pojo{map={246=SubPojo{map={test1=one}}, 355=SubPojo{map={test2=two}}}}
Если вы хотите остаться с вашей моделью данных, используйте аннотацию JsonAnySetter
. Ваша модель данных может выглядеть так:
class Pojo {
private Map<String, SubPojo> subMap = new HashMap<>();
@JsonAnySetter
public void addToMap(String key, SubPojo value) {
subMap.put(key, value);
}
@Override
public String toString() {
return "POJO{" +
"subMap=" + subMap +
'}';
}
}
class SubPojo {
private Map<String, String> map = new HashMap<>();
@JsonAnySetter
public void addToMap(String key, String value) {
map.put(key, value);
}
@Override
public String toString() {
return "SubPojo{" +
"map=" + map +
'}';
}
}
Приведенный выше пример использования печатает:
POJO{subMap={355=SubPojo{map={test2=two}}, 246=SubPojo{map={test1=one}}}}