gpt4 book ai didi

java - jackson (反)序列化对象作为它的 id

转载 作者:行者123 更新时间:2023-11-29 08:04:43 25 4
gpt4 key购买 nike

给定 POJO:

@XmlRootElement
public class Categories implements Serializable {
private int id;
private String name;

private Categories parent;

// ....

}

我想将它序列化为以下 json:

{ id: 1, name: "some name", parent: 5 }

因此,这里的主要挑战是将父对象表示为它的 id。我想要的一样用于反序列化。

我扫描了相当大的 Jackson 维基,但没有发现任何允许无需编写过多的自定义代码即可完成此操作。我认为这是很常见的任务,解决方案应该就在附近。

另外,如果解决方案允许自定义空值情况,那就太好了。

更新:

现在尝试使用 XmlTypeAdapter 方法,但对它不满意,因为我需要编写 TypeAdapter对于我拥有的每一种类型,它们都将包含几乎相同的代码:

public class CategoriesTypeAdapter extends XmlAdapter<Integer, Categories> {

@Inject
CategoriesFacade dao;

@Override
public Categories unmarshal(Integer v) throws Exception {
return dao.find(v);
}

@Override
public Integer marshal(Categories v) throws Exception {
return v.getId();
}
}

Categories.java 的变化:

    @XmlJavaTypeAdapter(CategoriesTypeAdapter.class)
private Categories parent;

UPD1:

这对我也不起作用,至少反序列化现在总是返回 null 代替对象,不知道如何调试它:对于这个 JSON:

{ id: 1, name: "test", parent: 5 }

我现在让 parent 总是空的:

Categories{categoryId=1, name="test", parentId=null}

UPD2:

我发现 htere 是我在这个问题上的失败,只是没有正确设置,而且我的 web.xml 缺少此条目:

<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.neopod.rest</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
</servlet>

最佳答案

根据确切的语义,有两种可能有效的方法。

首先是使用注释对 @JsonManagedReference/@JsonBackReference,其中第一个用于“forward”属性,第二个用于“backward”引用。在这些情况下,第二个属性不包含在序列化中,但会在反序列化期间恢复。这适用于简单的分层对象。

其次是 @JsonIdentityInfo(在 2.0 中添加),它添加了对任意对象引用的支持,无论方向如何。它的工作原理是将每个对象在第一次出现时按原样序列化;但在后来的引用中将它们序列化为 id。反序列化自动恢复链接。

关于java - jackson (反)序列化对象作为它的 id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12018227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com