Сделать Джексон интерпретировать один объект JSON как массив с одним элементом
Есть ли способ заставить Джексона интерпретировать единственный объект JSON как массив с одним элементом и наоборот?
Пример: у меня есть 2 немного разных формата JSON, мне нужно, чтобы они отображались на один и тот же объект Java:
Формат A (массив JSON с одним элементом):
points : [ {
date : 2013-05-11
value : 123
}]
Формат B (объект JSON, да, я знаю, что это выглядит "неправильно", но это то, что мне дано):
points : {
date : 2013-05-11
value : 123
}
Целевой объект Java, который оба из вышеперечисленного должны преобразовать в:
//Data.java
public List<Point> points;
//other members omitted
//Point.java
class Point {
public String date;
public int value;
}
В настоящее время только A будет корректно анализировать данные. Я хочу избежать прямого вмешательства в сам JSON. Есть ли какая-то конфигурация в Jackson, с которой я могу вмешиваться, чтобы она принимала B?
Ответы
Ответ 1
Попробуйте DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY
- он должен работать для вас.
Пример:
final String json = "{\"date\" : \"2013-05-11\",\"value\" : 123}";
final ObjectMapper mapper = new ObjectMapper()
.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
final List<Point> points = mapper.readValue(json,
new TypeReference<List<Point>>() {
});
System.out.println(points);
Ответ 2
В совместимой версии Jackson 1.x используется DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY
. Таким образом, указанный ответ изменяется на:
final String json = "{\"date\" : \"2013-05-11\",\"value\" : 123}";
final ObjectMapper mapper = new ObjectMapper()
.enable(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
final List<Point> points = mapper.readValue(json,
new TypeReference<List<Point>>() {
});
System.out.println(points);