3

json に jersey と jackson を使用する dropwizard を使用しています。私の問題は、ルートを指定していないリストを返すときです。

私は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 をもう 1 つ作成する必要があります。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

JacksonAPIを使用してカスタマイズできると思います。ObjectWriterを使用して生成されたJSONのルートを設定できる1つのアプローチを次に示します。

    @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/all ではなく、パス /companies を使用することです。

于 2013-01-24T09:52:46.993 に答える