2016-01-23 3 views
0

Ищем общий способ deserialise с Джексоном JSON, такие как:член массива Deserialise POJO из его строкового представления

{ 
    "hello": "baby", 
    "eyes": "[blue,green]" 
} 

К POJO, такие как

public class Whatever { 
    @Setter private String hello; 
    @Setter private List<Color> eyes; 
} 

С Цвет будучи ENUM.

Когда я пытаюсь наивности, как показано ниже:

ObjectMapper mapper = new ObjectMapper(); 
mapper.convertValue(properties, objectClass); 

Я получаю ошибку

Can not deserialize instance of java.util.ArrayList out of VALUE_STRING token 

Очевидно, что это происходит потому, Джексон может только deserialise массивы из JSON массивов, а не их строковое представление.

Я попытался активировать ACCEPT_SINGLE_VALUE_AS_ARRAY, но было бы рассмотреть вопрос о стоимости имущества «глаза», чтобы быть массивом с одним элементом Строки «[синий, зеленый]» (который не может преобразовать к перечислению Color)

Любой намек был бы очень оценен.

ответ

1

Проблема не то, что ACCEPT_SINGLE_VALUE_AS_ARRAY является причиной «глаза» свойства быть истолкована как массив с одним элементом, что опция позволяет Джексон принуждать тип, так что

{ 
    "hello": "baby", 
    "eyes": "[blue,green]" 
} 

будет интерпретироваться таким же в

[{ 
    "hello": "baby", 
    "eyes": "[blue,green]" 
}] 

Таким образом отдельные элементы могут быть использованы с коллекциями Java более подробную информацию можно найти на

http://fasterxml.github.io/jackson-databind/javadoc/2.0.0/com/fasterxml/jackson/databind/DeserializationFeature.html#ACCEPT_SINGLE_VALUE_AS_ARRAY

Насколько ваша проблема идет, лучшим вариантом было бы иметь JSON, представленный с цветом как массив JSON, как:

{ 
    "hello": "baby", 
    "eyes": [ 
    "blue", 
    "green", 
    ] 
} 

В противном случае вам, возможно, придется иметь свой Whatever класс имеют @JsonSetter аннотацию на методе setEyes с параметром String, где вы разбираете строку, чтобы вручную создать список Color.

@JsonSetter 
public void setEyes(final String eyes) { 
    // Parse string and set field here 
} 
+0

После расследования, похоже, что это не может помочь, как вы предложили. Поэтому я закончил реализацию своей собственной системы. Спасибо за подсказки! –