Используйте Джексона для обработки запроса Ember JSON API
Я использую Ember для создания клиентского приложения, а бэкэнд - это сервлет Java, использующий Джексона для обработки вызовов.
Создание вызова клиента из Ember выглядит так:
{
"customer":{
"name":"4545",
"email":"454545",
"authenticator":"facebook"
}
}
С данными JSON в этом формате я НЕ МОГУ использовать простое решение от Джексона
mapper.readValue(jsonData, Customer.class);
Поскольку поля клиента не находятся на первом уровне данных JSON. Мне пришлось обработать данные JSON, чтобы получить поля клиента, и реализовать это следующим образом:
JsonNode rootNode = mapper.readTree(jsonData);
Iterator iterator = rootNode.fields();
Entry first = (Entry) iterator.next();
ObjectNode node = (ObjectNode) first.getValue();
mapper.readValue(node.toString(), Customer.class);
Но я ищу лучший способ сделать это или что-то из коробки от Джексона. какие-либо предложения?
1 ответ
Попробуйте игнорировать данные первого уровня, чтобы игнорировать customer
поле и обрабатывать внутренние данные, используя DeserializationConfig.UNWRAP_ROOT_VALUE
свойство (эта функция включена в версии 1.9.0 и более поздние):
Функция, позволяющая "разворачивать" значение JSON корневого уровня, чтобы соответствовать настройке SerializationConfig.Feature.WRAP_ROOT_VALUE, используемой для сериализации. Проверяет, что корневое значение JSON является объектом JSON и имеет единственное свойство с ожидаемым корневым именем. Если нет, генерируется исключение JsonMappingException; в противном случае значение обернутого свойства будет десериализовано, как если бы оно было корневым значением.
Это будет включать в себя только одну дополнительную инструкцию для настройки вашего картографа:
mapper.configure(SerializationConfig.Feature.UNWRAP_ROOT_VALUE, true);
try
{
Customer customer = mapper.readValue(jsonData, Customer.class);
}
catch (IOException ioe)
{
//...
}
Вам также может понадобиться добавить имя корневого элемента вашего класса модели, если оно еще не добавлено, чтобы Джексон мог сопоставить его с именем корневого уровня в фиде JSON во время десериализации:
@JsonRootName("customer")
public class Customer {
//...
}