0

使用 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 格式不匹配。

4

1 回答 1

0

在 stackOverflow 上,有很多像你这样的已回答问题。这是一个解决方案:

objectMapper.configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, true);

你可以看到类似的问题:

于 2013-08-14T05:53:50.547 回答