给定 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 wiki,没有找到任何可以在不编写过多自定义代码的情况下完成此任务的东西。我认为这是很常见的任务,解决方案应该在附近的某个地方。
如果解决方案允许自定义空值情况,那就太好了。
升级版:
现在尝试使用XmlTypeAdapter
approch,但对它不满意,因为我需要为我拥有的每一种类型编写 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:
我发现这是我在这个问题上的失败,只是没有正确设置东西,而且我的 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>