鉴于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。同样的事我想要 反序列化。
我扫描了相当大的杰克逊维基并没有发现任何允许的内容 无需编写大量自定义代码即可实现此目的。 我认为这是非常常见的任务,解决方案应该在附近。
如果解决方案允许自定义空值案例,那也很好。
UPD:
现在尝试使用XmlTypeAdapter
approch,不满意btw,因为我需要编写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 }
我现在父母总是为空:
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>
答案 0 :(得分:4)
根据确切的语义,有两种方法可行。
首先使用注释对@JsonManagedReference
/ @JsonBackReference
,其中第一个用于“forward”属性,第二个用于“向后”引用。在这些情况下,第二个属性不包括在序列化中,但在反序列化期间恢复。这适用于简单的分层对象。
第二个是@JsonIdentityInfo
(在2.0中添加),它增加了对任意对象引用的支持,无论方向如何。它通过序列化每个对象来工作,因为它是第一次被看到;但在后来的参考文献中将它们序列化为ids。反序列化会自动恢复链接。
答案 1 :(得分:1)
使用对Categories
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class Categories implements Serializable {
@XmlElement
Integer categoryId;
@XmlElement
String name;
Categories parentId;
public Integer getCategoryId() {
return categoryId;
}
public String getName() {
return name;
}
@XmlElement
public Integer getParentId()
{
return parentId == null ? null : parentId.getCategoryId();
}
}
测试
Categories c = new Categories();
c.categoryId = 1;
c.name = "name";
Categories c1 = new Categories();
c1.categoryId = 2;
c.parentId = c1;
System.out.println(new ObjectMapper().writeValueAsString(c));
输出
{"categoryId":1,"parentId":2,"name":"name"}
修改强>
做两件事。
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class Categories实现Serializable {
@XmlElement
Integer categoryId;
@XmlElement
String name;
Categories parentId;
public Integer getCategoryId() {
return categoryId;
}
public String getName() {
return name;
}
public Category getParentId()
{
return parentId;
}
@XmlElement(name = "parentId")
Integer getParentIdForJSON()
{
return parentId == null ? null : parentId.getCategoryId();
}
}