【发布时间】:2013-08-14 05:46:28
【问题描述】:
使用 Jackson 2.2.2 和 Apache CXF Web 服务客户端和服务器 API。 我发现不可能在不失败的情况下序列化/反序列化 JSON。
Java 类:
MyPojo
{
..... various properties
}
Jackson 生成的 JSON:
{
"MyPojo":
{
..... various properties
}
}
当我将完全相同的 JSON 发送回 Jackson 以供其使用时,它失败了:
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:
Unrecognized field "MyPojo" (class app.model.MyPojo), not marked as ignorable (17 known properties: ,.....
理想情况下,Jackson 不会用 {"MyPojo":} 包装 MyPojo 对象,因为我只交换 MyPojo 对象,所以它是隐含的。 为此,我怎样才能让杰克逊制作:
{
..... various properties
}
那么,如何让 jackson 使用相同的 JSON 而不会失败?即我必须使用什么 ObjectMapper 配置或注释或两者的组合?
如果这是不可能的,那么我如何配置/注释以让 Jackson 使用“包装”的 JSON 而不会失败?
另外,
在生成/使用 MyPojo 对象数组时,我遇到了同样的问题:
Jackson 生成的 JSON:
{
"MyPojo":
[
{
..... various properties
},
{
..... various properties
}
]
}
..当消费失败时:
com.fasterxml.jackson.databind.JsonMappingException:
Can not deserialize instance of app.model.MyPojo[] out of START_OBJECT token
再次,理想情况下(但不是必需的)杰克逊会生产/消费:
[
{
..... various properties
},
{
..... various properties
}
]
注意,当与返回 MyPojo 对象的 RESTful WS 资源方法结合使用时,Apache CXF WS 似乎通过其 @GET、@POST 等注释执行了一些魔法,即似乎在我的方法返回之后对象,它被转换成 JSON。
为此,我不确定本地甚至全局 ObjectMapper 是否会影响输出,因此在回答时也应考虑这一点。
另外注意,我还需要通过 JAXB 在 XML 中生成和使用相同的 POJO。
编辑: 我现在很确定 TomEE/CXF 没有使用 Jackson,这就是我的问题的原因。我会在它开始工作时更新。
已解决: 进一步的调查显示,虽然 JSON 被 Jackson 脱轨,但由于 CXF/TomEE 中默认 JSON 提供程序的配置错误,在序列化时默认的 Jettison 提供程序没有被 Jackson 覆盖。这导致 Jackson - Jettison 格式不匹配。
【问题讨论】: