7

有没有办法用@JsonIdentityInfo 影响序列化过程,以便插入整个对象而不是引用id?

@Entity
@JsonIdentityInfo(
        generator = ObjectIdGenerators.IntSequenceGenerator.class,
        property = "linkLabel")
public class LinkLabel implements Serializable {
   //...
}

因此,杰克逊不应引用 id 为 1 的“otherObj”,而应包括整个对象。

{
    "objects": [{
            "id": 1,
            "otherObj": [{
                    "id": 1,
                    ...
                }, {
                    "id": 3,
                    ...
                }]
        },
            "id": 2,
            "otherObj": [1] <-- referencing otherObj with id 1
    ]
}

像这儿:

{
    "objects": [{
            "id": 1,
            "otherObj": [{
                    "id": 1,
                    ...
                }, {
                    "id": 3,
                    ...
                }]
        },
            "id": 2,
            "otherObj": [{
                    "id": 1,  <-- desired format, whole object
                    ...
                }]
    ]
}

我们有双向引用,所以 @JsonManagedReference 和 @JsonBackReference 不能正常工作。此处描述了此行为 ( http://wiki.fasterxml.com/JacksonFeatureObjectIdentity )。

4

3 回答 3

2

就像评论和链接中所说的那样,@JsonIdentityInfo 和杰克逊生成器似乎没有启用插入对象而不是 id 的选项。

经过更多研究,我们终于找到了这个: deserialize Jackson object in JavaScript contains JsonIdentityInfo

这正是我们所拥有的场景,我们现在正在使用 JSOG,它针对双向引用进行了优化,它在服务器和客户端 (AngularJS) 端就像一个魅力。

于 2016-01-04T16:27:28.613 回答
0

是我找到的最佳解决方案。通过清理循环引用@JsonIdentityInfo和现在公开的解决方案,我没有循环引用,杰克逊返回整个值数组

于 2020-06-03T16:29:08.073 回答
0

问题恰恰在于 Jackson 如何将 java 对象序列化为 JSON。当我们使用@JsonIdentityInfo 解决对象图中的循环依赖问题时,我们正在强制序列化机制将JSON 中Java 对象的第一次出现序列化,并将随后的出现替换为生成的id。

何时为 Java 对象创建 JSON 的决定因素基于对创建 JAVA 对象的内存位置的访问。

因此,欺骗序列化机制的一种好方法是创建子对象的副本,然后设置它。这样,属于集合中不同父级的相同子对象被视为不同的子对象实例。

创建对象的精确副本的一种好方法是使用 SerializationUtils.serialize/desrialize 方法。

    byte[] bs= SerializationUtils.serialize(classObject);
    ClassObject cloneEntity = (ClassObject ) SerializationUtils.deserialize(bs);

这会在不同的内存重定位中创建对象的精确副本。

于 2018-02-16T14:59:31.503 回答