Java 如何使Jersey/Jackson序列化空列表;作为数组的单个元素列表

Java 如何使Jersey/Jackson序列化空列表;作为数组的单个元素列表,java,json,jersey,jackson,Java,Json,Jersey,Jackson,使用Jersey和Jackson创建REST接口,当列表字段中有0或1个元素时,如何将其序列化为列表。例如: @XmlRootElement(name="foo") public class Foo { @XmlElement public List<Bar> getBars() { return this.bars; } } @Path("foo") public FooResource { @GET public Foo getFoo() {

使用Jersey和Jackson创建REST接口,当列表字段中有0或1个元素时,如何将其序列化为列表。例如:

@XmlRootElement(name="foo")
public class Foo {
  @XmlElement
  public List<Bar> getBars() {
    return this.bars;
  }
}

@Path("foo")
public FooResource {
  @GET
  public Foo getFoo() {
    return theFoo;
  }
}
@XmlRootElement(name=“foo”)
公开课Foo{
@XmlElement
公共列表getbar(){
把这个还给我;
}
}
@路径(“foo”)
公共食物资源{
@得到
公共Foo getFoo(){
返回theFoo;
}
}
当条形图没有元素时,结果序列化为
null
,当它包含单个元素时,它序列化为该元素,而不是包含单个元素的数组。有没有办法让它们始终序列化为数组


作为参考,我使用的是Jersey 1.10和Jackson 1.9.2。

很久以前我写过一篇博客文章,内容是关于强迫Jersey正确序列化单元素数组,不确定它现在是否过时(从2010年年中开始!)

请注意Brill Pappin在博客上的评论,它展示了一种不同的方法,这意味着升级您正在使用的抛弃库

简而言之,您可以编写一个定制的JaxbContextResolver,它看起来有点像:

@Provider
@Component
public class JAXBContextResolver implements ContextResolver {

    private JAXBContext context;

    public JAXBContextResolver() throws Exception {
        MappedBuilder builder = JSONConfiguration.mapped();
        builder.arrays("invite");
        builder.rootUnwrapping(true);
        this.context = new JSONJAXBContext(builder.build(), Payload.class);
    }

    public JAXBContext getContext(Class objectType) {
        return (Payload.class.equals(objectType)) ? context : null;
    }
}
为了清楚起见,我的有效载荷类看起来有点像

@XmlRootElement(name = "response")
@XmlAccessorType(XmlAccessType.FIELD)
public class Payload {

    @XmlElement(name = "invite")
    List invites;

    ... etc.

关于停止Jackson将bean属性序列化为null,请参见

,我非常确定您实际上没有使用Jackson(“POJO”JSON序列化的变体),因为Jackson不会将单元素数组或列表转换为任何其他内容。因此,您可能正在使用一种传统的输出方法(如抛弃);这意味着,若您将系统配置为使用POJO映射,它应该可以正常工作。

我在最近的Jersey JSON库(2012年9月1.14日)中设法解决了JSON数组“bug”。秘密成分是JSONConfiguration和ContextResolver魔法。请参阅我下面的文章,它有一个完整的代码示例,定制的ContextResolver和rest应用程序类在第一眼看上去可能有些模糊逻辑


原语和零元素或单元素列表数组被正确序列化为JSON文档。

是的,我们也面临同样的问题。Jackson无法将包含0或单个元素的列表序列化为json数组。因此,我们尝试使用Json的ObjectMapper将POJO对象转换为字符串。它将java列表序列化为json数组,而不考虑列表中的元素数(0或1或>0)。代码如下所示:

 request = new ObjectMapper().writeValueAsString(pojo);

其中,请求的类型为Object。这不会影响响应。你可以试试。

好的。我创建了一个ContextResolver,它使用反射来更改数据bean中所有列表的序列化行为。这对我来说还是有点太残忍了。如果有更好的方法,仍然有兴趣。看看Brill Pappin在我的博客链接上的评论,从答案来看,他描述了一个解决方案,您可以升级Jackson依赖的抛弃版本。嗯,您可能指的是“Jersey依赖的抛弃”(对于JSON绑定方法之一)。Jackson不依赖于抛弃(反之亦然)您是正确的,Jackson没有正确配置。除了将“org.codehaus.Jackson.jaxrs”添加到com.sun.Jersey.config.property.packages init param之外,还有没有更明确的方法来配置Jersey内部使用的Jackson?可以使用标准jax-rs注册机制从jax-rs jar(
JacksonJsonProvider
)显式注册提供程序类,请参阅(例如)详情请参阅。