Подтвердить что ты не робот

Сделать Джексон интерпретировать один объект 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?

4b9b3361

Ответ 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);