Как десериализовать следующий json с помощью Jackson - PullRequest
6 голосов
/ 30 марта 2011

У меня есть следующий json:

{
  "id":"myid",
  "fields":{
    "body":"text body"
    }
}

, который я хочу десериализовать в следующий класс Java:

class TestItem {
private String id;
private String body;

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getBody() {
    return body;
}

public void setBody(String body) {
    this.body = body;
}

с использованием десериализатора Джексона Json.Это не работает, потому что поле body вложено во внутренний класс fields.

Я не могу изменить структуру json, поэтому есть ли способ (возможно, с использованием аннотаций), я могу переназначить поле body с TestItem.fields.body до TestItem.body?

Редактировать: Я должен был сказать, что это является частью более широкой иерархии классов, и цель упражнения - уменьшить его глубину.Другими словами, я знаю, что МОГУТ объявить внутренний класс, а затем получить к нему доступ, но это не то, чего я пытаюсь достичь.

1 Ответ

5 голосов
/ 31 марта 2011

Есть несколько запросов к функциям, которые (если они будут реализованы) позволят ограничить одноуровневую упаковку / развертывание. Но в настоящее время нет декларативного способа сделать это. И в некоторой степени это крайний случай, так как это идет на преобразование данных, а не на привязку данных (к сожалению, я не могу думать о хороших библиотеках преобразования объектов, поэтому там может быть небольшой пробел).

Затем обычно выполняется двухфазное связывание: сначала на промежуточные типы (часто java.util.Map или jackson JsonNode (модель дерева)); изменить их, а затем преобразовать из этого типа в фактический результат. Например что-то вроде этого:

JsonNode root = mapper.readTree(jsonSource);
// modify it appropriately (add, remove, move nodes)
MyBean bean = mapper.convertValue(root, MyBean.class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...