Вы можете создать собственный десериализатор для своего поля. Предполагая, что вы хотите отобразить его на SomeClass
объект:
public class SomeClass {
@JsonDeserialize(using = CustomPropertyDeserializer.class)
private Properties property;
public Properties getProperty() {
return property;
}
public void setProperty(Properties property) {
this.property = property;
}
}
Вы аннотируете свое поле, которое хотите десериализовать, с помощью @JsonDeserialize
аннотации, передавая пользовательский десериализатор.
Ваш десериализатор может выглядеть так:
public class CustomPropertyDeserializer extends StdDeserializer<Properties> {
public CustomPropertyDeserializer() {
super(Properties.class);
}
@Override
public Properties deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
String valueAsString = p.getValueAsString();
String[] split = valueAsString.split(":");
return new Properties(split[0], split[1]);
}
}
И класс пользовательских свойств:
public class Properties {
private String first;
private String second;
public Properties(String first, String second) {
this.first = first;
this.second = second;
}
public String getFirst() {
return first;
}
public void setFirst(String first) {
this.first = first;
}
public String getSecond() {
return second;
}
public void setSecond(String second) {
this.second = second;
}
}
Для тестирования это:
public static void main(String[] args) throws IOException {
String s = Files.lines(Paths.get("src/main/resources/data.json")).collect(Collectors.joining());
ObjectMapper objectMapper = new ObjectMapper();
SomeClass someClass = objectMapper.readValue(s, SomeClass.class);
System.out.println(someClass.getProperty().getFirst());
System.out.println(someClass.getProperty().getSecond());
}
Тогда вывод будет:
123
1234
Таким образом, вся пользовательская логика сопоставления вашей String с некоторым определенным вами классом может быть помещена в deserialize
метод вашего пользовательского десериализатора.