Используйте Джексона для обработки запроса 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 {
//...
}
Другие вопросы по тегам