【问题标题】:jackson with jaxb杰克逊与 jaxb
【发布时间】:2011-08-25 12:01:15
【问题描述】:

在泽西岛使用 Jackson JSON 处理器时,何时以及为什么需要在两者之间使用 JAXB 注释? Object->JAXB->JSON

Jackson 还提供了它自己的 JAX-RS 提供程序以直接访问 Object->JSON。这种方法缺少什么?或者为什么我更喜欢另一个

ps:我也用弹簧

【问题讨论】:

    标签: java jaxb jax-ws jersey jackson


    【解决方案1】:

    要生成 JSON,您通常只需指定 @Produces(MediaType.APPLICATION_JSON)。然而,这将默认采用 JAXB 路由。

    使用 Object -> JAXB -> JSON,您必须使用 @XmlRootElement 注释要映射的类。这可以正常工作,但是一旦你开始序列化 HashMap,你最终不会得到一个明显的 {keyOne:"one",keyTwo:"two"},而是像 {entry:[{key:"keyOne",value:"one"},{key:"keyTwo",value:"two"}]} 这样奇怪的东西。

    所以要采用直接 Object -> JSON 方式,只需在 web.xml 中指定以下内容:

        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>
    

    使用此 JSON 映射将按照您期望的方式工作。只是不要忘记删除 @XmlRootElement 注释,它们会在 POJO 映射打开时强制生成 XML。

    也看看我的问题:Java.util.Map to JSON Object with Jersey / JAXB / Jackson

    参考:http://jersey.java.net/nonav/documentation/latest/json.html#d4e894

    【讨论】:

    • 谢谢,您说要删除@XmlRootElement,但是如果我不使用任何JAXB,它是从哪里来的? ALso 我的一个资源类实现了另一个项目引用的接口类。有问题吗?
    • 我实际上不确定是否需要删除;杰克逊不会要求它(即它没有害处),尽管泽西岛可能有一些特定的处理方式。
    【解决方案2】:

    如果您还想以 XML 格式生成/使用数据,则只需要使用 JAXB 注释。

    如果你只关心 JSON,不要使用 JAXB 注解;除了杰克逊注释之外,他们没有提供任何东西。事实上,大多数情况下,基本情况都可以通过使用 Java Bean 命名约定来处理,而无需任何注释。

    【讨论】:

      猜你喜欢
      • 2014-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      相关资源
      最近更新 更多