3

我正在使用 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;
}

我得到以下回复:

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

虽然我想要的是如下所示:

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

有任何想法吗?提前致谢。

4

3 回答 3

7

您需要再创建一个 POJO 包装List<Company>

public class ApiResponse
{
   private List<Company> Companies;
   //Getter and Setter
   //Public Constructor
}

您的 GET 方法所需的更改是:

@GET
@Path("/companies/all")
public ApiResponse getAllCompanies(){
    //Set your ApiResponse Object with the companies List.
    ApiResponse apiResponse = new ApiResponse(companies);
    return apiResponse;
}
于 2013-01-24T04:00:50.557 回答
2

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

    @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();
    }
于 2013-01-24T08:55:22.890 回答
2

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

public List<Company> getAllCompanies(){

如果你想返回一个带有 Companies 值的 JSON 对象,那么你需要一个与之匹配的合适的 Java 对象。

public class MyListOfCompanies {
  List<Companies> companies;
}

然后你会要求你的代码返回它:

public MyListOfCompanies getAllCompanies(){

但是,请考虑您是否真的想这样做。如果您考虑某人为您的 API 进行编码的情况,他们是否更愿意收到公司列表(正如他们所要求的并且 API 暗示他们将获得),或者除了包含公司列表之外没有其他用途的对象?

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

于 2013-01-24T09:52:46.993 回答