Сериализация jacksonа JSON, предотrotation рекурсии путем определения уровня

Я использую библиотеку jacksonа для сериализации моих объектов pojo в представлении JSON . Например, у меня есть class A и class B:

 class A { private int id; private B b; constructors... getters and setters } class B { private int ind; private A a; constructors... getters and setters } 

Если я хочу сериализовать объект из classа А, есть определенная возможность получить рекурсию, когда она сериализована. Я знаю, что могу остановить его, используя @JsonIgnore .

Можно ли ограничить сериализацию глубиной?

Например, если уровень равен 2, сериализация будет идти следующим образом:

  • serialize a, level = 0 (0 сериализовать
  • serialize ab, level = 1 (1 сериализовать
  • serialize aba, level = 2 (2 stop

Заранее спасибо.

Проверьте следующие ссылки, это может помочь:

Единственным вариантом после этого было бы создание собственного настраиваемого модуля для сериализации / десериализации для вашего типа объекта. глянь сюда:

С уважением.

Недавно я столкнулся с аналогичной проблемой: jackson – сериализация сущностей с двунаправленными отношениями (избегая циклов)

Таким образом, решение заключается в обновлении до Jackson 2.0 и добавлении к classам следующей annotations:

 @JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "@id") public class SomeEntityClass ... 

Это прекрасно работает.

Нет поддержки для игнорирования уровня.

Но вы можете заставить jacksonа обрабатывать циклические ссылки с 2.0, см., Например, « Jackson 2.0 выпущен » для объяснения того, как использовать @JsonIdentityInfo .

Для сериализации по глубине вы можете обратиться к примеру здесь https://github.com/abid-khan/depth-wise-json-serializer

Если вы хотите ограничить себя только одним уровнем (то есть: вы переходите к дочерним элементам текущего объекта, а не далее), есть простое решение с @JsonView.

В каждом поле, которое является ссылкой на другой объект, аннотируйте его с текущим classом в качестве вашего представления:

 class A { private int id; @JsonView(A.class) private B b; constructors... getters and setters } class B { private int ind; @JsonView(B.class) private A a; constructors... getters and setters } 

Затем, при сериализации, используйте class объекта в качестве представления. Сериализация экземпляра A будет выглядеть примерно так:

 { id: 42, b: { id: 813 } } 

Убедитесь, что для параметра DEFAULT_VIEW_INCLUSION установлено значение true, или поля без annotations @JsonView не будут отображаться. Кроме того, вы можете аннотировать все остальные поля с помощью @JsonView с использованием classа Object или любого обычного суперclassа:

 class A { @JsonView(Object.class) private int id; @JsonView(A.class) private B b; constructors... getters and setters } 

В некоторых случаях вы можете ограничить глубину сериализации, используя локальное целое число streamов, максимальное значение глубины. См. Этот ответ .

После нескольких месяцев и большого количества исследований я реализовал свое собственное решение, чтобы сохранить мой домен без зависимостей Jackson.

 public class Parent { private Child child; public Child getChild(){return child;} public void setChild(Child child){this.child=child;} } public class Child { private Parent parent; public Child getParent(){return parent;} public void setParent(Parent parent){this.parent=parent;} } 

Во-первых, вы должны объявить каждое из ваших сущностей двунаправленных отношений примерно так:

 public interface BidirectionalDefinition { @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id", scope=Parent.class) public interface ParentDef{}; @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id", scope=Child.class) public interface ChildDef{}; } 

После этого можно автоматически настроить сопоставление объектов:

 ObjectMapper om = new ObjectMapper(); Class[] definitions = BidirectionalDefinition.class.getDeclaredClasses(); for (Class definition : definitions) { om.addMixInAnnotations(definition.getAnnotation(JsonIdentityInfo.class).scope(), definition); } 
  • Как десериализовать JSON с двойными именами свойств в одном и том же объекте
  • Удаление десериализации полиморфных classов json без информации о типе с использованием json.net
  • Избегайте сериализации jacksonа на непривлекательных ленивых объектах
  • Можете ли вы определить, был ли объект, десериализованный объект, отсутствием поля с classом JsonConvert в Json.NET
  • Автоматическая десериализация свойств C #
  • Удаление десериализации JSON в объект с помощью Json.NET
  • Сериализация JSON массива с полиморфными объектами
  • Jackson ObjectMapper - указать порядок сортировки свойств объекта
  • Исключение «Исключительная привязка к реляционной ссылке» с JSON.Net
  • XSLT: как преобразовать XML-узел в строку
  • Как изменить имена свойств при сериализации с помощью Json.net?
  • Interesting Posts

    Невозможно приостановить или hibernate после выбора объекта

    Почему StringBuilder, когда есть String?

    При установке Windows 7 появляется ошибка 5 CDBOOT: Невозможно загрузить с компакт-диска; Зачем?

    Загрузка jQuery страниц WordPress через ajax

    Почему современные процессоры «разогнанны»?

    Настроить трекбол под Linux без редактирования Xorg.conf

    Алгоритм создания кроссворда

    Лучший алгоритм хеширования с точки зрения hash-коллизий и производительности для строк

    Динамическая проверка и имя в форме с помощью AngularJS

    Могу ли я получить список времени компиляции всех объектов case, которые происходят из запечатанного родителя в Scala?

    Android Bitmap для Base64 String

    Вызов базового конструктора в C #

    Безопасность HTML5 localStorage

    У палки RAM есть несколько плохих блоков. Есть ли способ отключить их или выделить плохие блоки, чтобы другие программы не могли их использовать?

    Почему pinging «drive» получает ответы от 127.0.53.53?

    Давайте будем гением компьютера.