【问题标题】:How to ignore list root with json/jackson serialization?如何使用 json/jackson 序列化忽略列表根?
【发布时间】:2012-02-02 10:36:02
【问题描述】:

我有一个用 @XmlRootElement 注释的简单 Bean:

@XmlRootElement
public class MyBean {
    private String name;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

我有一个简单的球衣服务,它公开了这个 bean 和这个 bean 的列表:

@Component
@Path("/myresource")
public class MyResource {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List<MyBean> getAll() {
          //...
          return list;
    }

    @GET 
    @Path("{id}")
    @Produces(MediaType.APPLICATION_JSON)
    public MyBean getById(@PathParam("id") long id) {
        //...
        return bean;
    }
}

问题在于,当我得到 bean 列表时,我得到了以下 json:

{"myBean":[{"name":"Hello"},{"name":"Plop"}]}

我想要的是(没有列表根名称):

{[{"name":"Hello"},{"name":"Plop"}]}

有没有一种简单的方法可以做到这一点,我没有找到任何注释?我不想为列表创建包装器。是否需要修改jackson配置,或者创建mapper,...?

感谢您的帮助。

【问题讨论】:

    标签: json jersey jackson


    【解决方案1】:

    感谢您的帮助,但我对数组有相同的结果。

    取而代之的是,我删除了 MyBean 上的 XmlRootElement 注释,并在 servlet 声明的 web.xml 中添加了以下内容:

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

    【讨论】:

    • 这很重要——您可能使用了一种映射器符号(badgerdfish/jettison,natural),它添加了包装器元素。 @XmlRootElement 应该可以使用 POJO 映射,尽管不需要任何东西。
    • Jersey 在列表和数组方面花了很多时间搞砸了。 POJO 映射应该可以解决这个问题,但可能需要一些代码调整。
    【解决方案2】:

    AFAIK,如果你使用

    MyBean[]
    

    你会得到你想要的,而不是 ArrayList!

    希望对你有帮助,

    天啊

    【讨论】:

      猜你喜欢
      • 2012-02-08
      • 2022-01-01
      • 2019-10-22
      • 1970-01-01
      • 2023-04-11
      • 2015-01-12
      • 2016-07-26
      • 2012-02-01
      • 2013-04-11
      相关资源
      最近更新 更多