Пользовательский десериализатор Jackson JSON плохо работает с составным объектом - PullRequest
0 голосов
/ 23 ноября 2011

У меня проблема с моим пользовательским десериализатором JSON. Я использую Джексона, чтобы отобразить JSON на Java и обратно. В некоторых случаях мне нужно написать свое собственное отображение.

У меня есть объект (фильтр), который содержит набор других object(metaInfoClass). Я пытаюсь десериализовать фильтр с Джексоном, но я реализовал собственный десериализатор для внутреннего объекта. JSON выглядит так:

{     
 "freetext":false,
 "cityName":null,
 "regionName":null,
 "countryName":null,
 "maxResults":50,
 "minDate":null,
 "maxDate":null,
 "metaInfoClasses":
  [
     {
      "id":31,
      "name":"Energy",
      "D_TYPE":"Relevance"
     }
  ],
 "sources":[],
 "ids":[]
}

Мой десериализатор просто отлично работает, он находит все поля и т. Д. Проблема в том, что каким-то образом (не знаю почему) десериализатор вызывается для остальной части строки JSON, поэтому обрабатывается токен sources и так далее. Это очень странно, так как я не хочу десериализовать большой объект, а только внутренний metaInfoClass.

Еще более странно: класс CollectionDeserializer продолжает вызывать мой десериализатор со строкой json даже после ее завершения. Так что на самом деле ничего не происходит, но метод вызывается.

Есть идеи?

Большое спасибо!

1 Ответ

0 голосов
/ 05 декабря 2011

Мне удалось найти решение. Я изменил реализацию (в методе десериализации) для использования в следующем коде:

JsonNode tree = parser.readValueAsTree();
Iterator<Entry<String, JsonNode>> fieldNameIt = tree.getFields();

while (fieldNameIt.hasNext()) {
  Entry<String, JsonNode> entry = fieldNameIt.next();
  String key = entry.getKey();
  String value = entry.getValue().getTextValue();

  // ... custom code here
}

Таким образом, при таком подходе он анализировал только правильный фрагмент кода и работает прямо сейчас.

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