У меня есть доступ к RESTful API, который возвращает строки JSON, например:
{
"Container1": {
"active": true
},
"Container2": {
"active": false
},
}
Проблема заключается в том, что RESTful API немного неправильно разработан.Имя поля уже содержит данные.С библиотекой Джексона невозможно десериализовать имя поля в имя свойства соответствующего класса Java-бина.Я предполагаю, что это не предназначено ни спецификацией JSON.Приведенную выше строку JSON необходимо десериализовать в экземпляр следующего класса:
public class Container {
private Boolean active;
private String name;
}
Я получаю UnrecognizedPropertyException
для поля Container1
.
Я подумал настроить, чтобы игнорировать неизвестные свойства и предоставить JsonDeserializer
для этого свойства, например:
@JsonIgnoreProperties(ignoreUnknown = true)
public class Container {
private Boolean active;
private String name;
@JsonDeserialize(using = FieldNameToPropertyDeserializer.class)
public void setName(String name) {
this.name = name;
}
}
и FieldNameToPropertyDeserializer
:
public class FieldNameToPropertyDeserializer extends StdDeserializer<String> {
public FieldNameToPropertyDeserializer() {
super(String.class);
}
@Override
public String deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException {
return parser.getCurrentName();
}
}
Вызов десериализации достигается следующим образом:
String jsonString = response.readEntity(String.class);
ObjectMapper objectMapper = new ObjectMapper();
ObjectReader readerFor = objectMapper.readerFor(Container.class);
MappingIterator<Container> mappingIterator = readerFor.readValues(jsonString);
while (mappingIterator.hasNext()) {
Container container = (Container) mappingIterator.next();
containers.add(container);
}
Но я получаю только пустые объекты (свойства установлены на null
), потому что синтаксический анализ свойств пропускается, так как я установил @JsonIgnoreProperties(ignoreUnknown = true)
.
Возможно ли это вообще?Или я должен потом реализовать что-то вроде постобработки?