Сериализация 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
.
Можно ли ограничить сериализацию глубиной?
- Как сериализовать словарь как часть его родительского объекта с помощью Json.Net
- Использовать имя classа в качестве корневого ключа для сериализации JSON Jackson
- Почему java.util.Optional не является Serializable, как сериализовать объект с такими полями
- Использование JSON.NET для возврата ActionResult
- jQuery serializeArray не включает кнопку отправки, которая была нажата
Например, если уровень равен 2, сериализация будет идти следующим образом:
- serialize a, level = 0 (0 сериализовать
- serialize ab, level = 1 (1 сериализовать
- serialize aba, level = 2 (2 stop
Заранее спасибо.
- «Тип не ожидается», используя DataContractSerializer - но это просто class, не смешные вещи?
- Сериализация с Qt
- gwt - Использование списка в вызове RPC?
- Преобразование любого объекта в массив байтов в java
- Сериализация OpenCV Mat_
- C # десериализация структуры после ее получения через TCP
- Сериализовать компоненты JavaFX
- Deserialize JSON в динамический объект C #?
Проверьте следующие ссылки, это может помочь:
- http://wiki.fasterxml.com/JacksonFeatureBiDirReferences
- Как решить круговую ссылку в json serializer, вызванную двунаправленным сопоставлением спящего режима?
Единственным вариантом после этого было бы создание собственного настраиваемого модуля для сериализации / десериализации для вашего типа объекта. глянь сюда:
- http://wiki.fasterxml.com/JacksonHowToCustomSerializers
- http://wiki.fasterxml.com/JacksonHowToCustomDeserializers
С уважением.
Недавно я столкнулся с аналогичной проблемой: 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); }