У меня есть JSON файл, подобный этому:
{
"Properties": {
"String": "one-string-value",
"Number": 123,
"LiteralList": [
"first-value",
"second-value"
],
"Boolean": true,
"ReferenceForOneValue": {
"Ref": "MyLogicalResourceName"
}
}
}
Я хочу использовать Джексона, чтобы десериализовать его в правильный Map<String,Property>
. Для этого я использую TypeReference
примерно так:
public class Template {
@JsonProperty("Properties")
@JsonDeserialize(using = PropertyDeserializer.class)
public Map<String, Object> propertyList;
}
public class PropertyDeserializer extends JsonDeserializer<Map<String, Property>> {
public Map<String, Property> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
throws IOException, JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
Map<String,Property> result =
mapper.readValue(jsonParser, new TypeReference<Map<String,Property>>() {});
return result;
}
}
Каждый Property
может принимать только некоторые значения: строки, целые, логические значения, список строк или другой объект, имеющий один ключ " Ref». Поэтому я написал это:
public class Property {
private Object value;
public Property(String value) {
this.value = value;
}
public Property(int value) {
this.value = value;
}
public Property(List<String> values) {
this.value = values;
}
public Property(boolean value) {
this.value = value;
}
public Property(Ref reference) {
this.value = reference;
}
}
public class Ref {
private String reference;
@JsonCreator
public Ref(@JsonProperty("Ref") String reference) {
this.reference = reference;
}
}
Однако это не работает:
Для свойства LiteralList
я получаю ошибку Невозможно десериализовать экземпляр Property
из токена START_ARRAY
Для свойства ReferenceForOneValue
появляется ошибка Невозможно создать экземпляр Property
(хотя бы один Создатель существует): невозможно десериализовать из значения объекта (без создателя на основе делегатов или свойств)
Я загрузил весь исходный код здесь .
Может кто-нибудь помочь мне написать десериализатор для этого?