Десериализация массивов с Джексоном - PullRequest
6 голосов
/ 08 марта 2011

у меня что-то вроде клиента JSON-RPC, и у меня возникли проблемы с десериализацией входящая строка json в мой объект java. Входящий формат JSON:

{"value":"xxxx","type":"xxxx"}

Объект, к которому я хочу десериализоваться:

@JsonAutoDetect
@JsonDeserialize()
public class ReturnValue {

private Object value;
private String type;

@JsonCreator
public ReturnValue(@JsonProperty("value") String val, @JsonProperty("type") String type) {
    value = val;
    this.type = type;
}

...getters, setters...

Кажется, это работает нормально, если значение равно String, но если оно имеет тип массива, оно выдает Исключение JsonMapping - не удается десериализовать экземпляр java.lang.String из маркера START_ARRAY для JSON, как это:

{\"value\":[8, 10], \"type\":\"[int]\"}

Код:

int[] arr = (int[])getReturnValue(jsonString).getValue();

Где getReturnValue ничего особенного:

    ObjectMapper om = new ObjectMapper();
    ReturnValue rv = null;
    rv = om.readValue(json, ReturnValue.class);
    return rv;

Другая проблема состоит в том, что я хотел бы, чтобы свойство type было типа Class, но это еще одно исключение картографирования. Есть ли способ в Джексоне, чтобы сделать это, или я должен конвертировать из строки в соответствующий класс сам. Спасибо за любой совет.

1 Ответ

8 голосов
/ 09 марта 2011

Измените ваш конструктор на:

@JsonCreator
public ReturnValue(@JsonProperty("value") Object val, @JsonProperty("type") String type) {

, поскольку, как и указывает на ошибку, он не знает, как сделать строку из массива.Но и String, и JSON Array могут быть преобразованы в Object;в этом случае это будет строка Java String, или список Java (для массивов JSON), или карта Java (для объектов JSON).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...