Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dropwizard/Jersey将Java列表返回为JSON,不带根节点_Java_Jersey_Dropwizard - Fatal编程技术网

Dropwizard/Jersey将Java列表返回为JSON,不带根节点

Dropwizard/Jersey将Java列表返回为JSON,不带根节点,java,jersey,dropwizard,Java,Jersey,Dropwizard,我正在使用dropwizard,它使用jersey和jackson作为json。我的问题是,当我返回一个列表时,它没有指定根 我有一门POJO课程: public class Company { public String id; public String name; public String address; } 我的资源设置如下: @GET @Path("/companies/all") public List<Company> getAllCompanies(){

我正在使用dropwizard,它使用jersey和jackson作为json。我的问题是,当我返回一个列表时,它没有指定根

我有一门POJO课程:

public class Company { 
public String id; 
public String name; 
public String address; 
}
我的资源设置如下:

@GET
@Path("/companies/all")
public List<Company> getAllCompanies(){
    ...
    return companies;
}
而我想要的是如下所示:

{"Companies" : 
[{
"id": "01",
"name": "Yammer Corp",
"address": "1 Finite Loop"
},
{
"id": "02",
"name": "DropWizards Inc",
"address": "4 Magic Square, Olympus"
}
]}

有什么想法吗?提前谢谢

您需要再创建一个POJO来包装
列表


我相信您可以使用Jackson API进行定制。这里有一种方法允许您使用设置生成的JSON的根

@GET
@路径(“/companys/all”)
公共响应GetAllCompanys()引发JsonProcessingException{
列表公司=Lists.newArrayList();
公司yc=新公司();
yc.id=“01”;
yc.name=“Yammer公司”;
yc.address=“1有限循环”;
加上(yc),;
公司dw=新公司();
dw.id=“02”;
dw.name=“DrowWizards公司”;
dw.address=“奥林巴斯魔法广场4号”;
加上(dw),;
ObjectMapper ObjectMapper=新的ObjectMapper();
ObjectWriter writer=objectMapper.writer();
字符串实体=writer.withRootName(“公司”).writeValueAsString(公司);
返回Response.ok(entity.build();
}

如果您查看代码,则要求返回公司列表:

public List<Company> getAllCompanies(){
但是,如果你真的想这么做,一定要考虑一下。如果您考虑到有人向您的API编码的情况,他们是希望收到一份公司列表(正如他们要求的那样,API暗示他们将获得),还是希望收到一份除了包含公司列表之外没有其他用途的对象


最后,对于良好的休息设计,获取所有公司列表的常见方法只是使用路径/companys,而不是/companys/all。

您需要再使用一个POJO包装。谢谢@Srinivas,我遵循了您的建议,它成功了!我对它做了一些修改:
public类JSONListWrapper{public List itemlist;public JSONListWrapper(List itemlist){this.itemlist=itemlist;}}
我倾向于使用一个名为
ApiResponse
的POJO,它具有
状态\u code>,
status\u消息
数据
,它们是
对象
,充当有效负载。感觉比修改ObjectMapper整洁多了。我同意REST Url/companys而不是/companys/all。然而,我看到了一个有效的用例“命名”JSON中的每个参数。我遇到过这样的人,他们把这些东西放在身体里,但没有一个人的名字。当JSON具有多个级别时,这是非常困难的。请记住,一旦您具有多个级别,那么除了顶层之外的所有内容都将被命名。您可以在问题的输出中看到这一点。此外,根据定义,您的顶级级别将永远不会被命名。创建容器对象所要做的就是在顶层放置一个新的未命名对象。
public class ApiResponse
{
   private List<Company> Companies;
   //Getter and Setter
   //Public Constructor
}
@GET
@Path("/companies/all")
public ApiResponse getAllCompanies(){
    //Set your ApiResponse Object with the companies List.
    ApiResponse apiResponse = new ApiResponse(companies);
    return apiResponse;
}
    @GET
    @Path("/companies/all")
    public Response getAllCompanies() throws JsonProcessingException {
        List<Company> companies = Lists.newArrayList();
        Company yc = new Company();
        yc.id = "01";
        yc.name = "Yammer Corp";
        yc.address = "1 Finite Loop";
        companies.add(yc);
        Company dw = new Company();
        dw.id = "02";
        dw.name = "DrowWizards Inc";
        dw.address = "4 Magic Square, Olympus";
        companies.add(dw);

        ObjectMapper objectMapper = new ObjectMapper();
        ObjectWriter writer = objectMapper.writer();
        String entity = writer.withRootName("Companies").writeValueAsString(companies);
        return Response.ok(entity).build();
    }
public List<Company> getAllCompanies(){
public class MyListOfCompanies {
  List<Companies> companies;
}
public MyListOfCompanies getAllCompanies(){