【问题标题】:Unwrap a element in Jackson/Jaxb在 Jackson/Jaxb 中打开一个元素
【发布时间】:2012-06-14 06:22:10
【问题描述】:

我正在使用 Jersey+Jackon 制作一个与 JSON 配合使用的 REST API。

假设我有一个类如下:

@XmlRootElement
public class A {
    public String s;
}

这是我使用该类的球衣方法:

@GET
@Produces(MediaType.APPLICATION_JSON)
public Object get(@PathParam("id") String id) throws Exception{
    A[] a= new A[2];
    a[0] = new A();
    a[0].s="abc";
    a[1] = new A();
    a[1].s="def";
    return a;
}

输出是:

{"a":[{"s":"abc"},{"s":"def"}]}

但我希望它是这样的:

[{"s":"abc"},{"s":"def"}]

我该怎么办? 请帮帮我。

【问题讨论】:

  • 我的情况有所不同。我要第一个。怎样才能做到这一点?对方就是这么期待的。

标签: java jaxb jersey jackson


【解决方案1】:

您的要求似乎是从 json 字符串中删除根元素。这可以在 Jersey 中进行如下配置。 在 Jersey 中,是否删除根元素由JSONConfiguration.rootUnwrapping() 配置。更多详情请见JSON support in Jersey and CXF

这是执行此操作的示例代码。

   @Provider
   public class MyJAXBContextResolver implements ContextResolver<JAXBContext> {

       private JAXBContext context;
       private Class[] types = {StatusInfoBean.class, JobInfoBean.class};

       public MyJAXBContextResolver() throws Exception {
           this.context = new JSONJAXBContext(
                   JSONConfiguration.mapped()
                                      .rootUnwrapping(true)
                                      .arrays("jobs")
                                      .nonStrings("pages", "tonerRemaining")
                                      .build(),
                   types);
       }

       public JAXBContext getContext(Class<?> objectType) {
           return (types[0].equals(objectType)) ? context : null;
       }
   }

【讨论】:

  • 我是 Jersey+Jackson 的新手。你能告诉我应该如何使用这段代码吗?
  • 如您所见,这是 JAX-RS 词汇表中的 @Provider。因此,将其注册为提供者。
  • 我知道这个过程在泽西岛有点复杂。在 CXF 上,配置非常简单。在那里,您可以通过 beans 文件简单地配置 CXF 附带的默认 json 提供程序。互联网上有大量关于如何使用 bean 的示例。
  • 这是一个关于如何在泽西岛使用@Provider 的示例。 goo.gl/WUtIzgoo.gl/dh05f
  • 一个有效的 XML 文档必须包含一个根元素。所以,我不确定你的要求。无论如何,我不确定是否有办法做到这一点。可能不会。
【解决方案2】:

第一个是有效的 JSON 字符串。

第二个不是。

【讨论】:

  • 我知道,但由于外部限制,我需要使用第二个。
【解决方案3】:

您可以尝试将以下内容添加到您的 web.xml 中,在相关的 &lt;servlet&gt; 节点下:

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

The Jersey documentation 有关于此设置的更多信息。

此功能是在 Jersey 1.4 中引入的,依赖于 Jackson。如果您使用的是 Glassfish 3.0.1 或更低版本捆绑的版本,则需要follow the upgrade instructions

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
相关资源
最近更新 更多