使用 Jackson 2.2.2 和 Apache CXF Web 服务客户端和服务器 API。我发现不可能在没有失败的情况下序列化/反序列化 JSON。
Java类:
MyPojo
{
..... various properties
}
杰克逊产生的 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
}
那么,如何让杰克逊使用相同的 JSON 而不会失败?即我必须使用什么ObjectMapper 配置或注释或两者的组合?
如果这是不可能的,那么我如何配置/注释以让杰克逊使用“包装”的 JSON 而不会失败?
还,
在生成/使用 MyPojo 对象数组时,我遇到了同样的问题:
杰克逊产生的 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 格式不匹配。