Dropwizard/Jersey将Java列表返回为JSON,不带根节点
我正在使用dropwizard,它使用jersey和jackson作为json。我的问题是,当我返回一个列表时,它没有指定根 我有一门POJO课程: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(){
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(){