Jax-rs (Джерси) для поиска массива объекта Json в запросе POST

Использование jax-rs (Jersey) Я пытаюсь реализовать запрос POST, который принимает список объектов JSON

//The resource look like this
@Path("/path")
@POST
@Consumes(MediaType.APPLICATION_JSON)
public void setJsonl(List<SomeObj> test) {
  //do work
  System.out.println(test);
}


//The class to define the json structure
@XmlRootElement
public class SomeObj{

private String tag;
private String value;

public String getTag() {
 return tag;
}

public void setTag(String tag) {
  this.tag = tag;
}

public String getValue() {
  return value;
}

public void setValue(String value) {
  this.value = value;
}
}

как всегда, когда я пытаюсь проверить REST api с помощью curl, я всегда получаю ошибку "плохой запрос", я что-то здесь не вижу?

curl -X POST -H "Content-Type: application/json" -d '{"SomeObj":[{"tag":"abc", "value":"ghi"},{"tag":"123", "value":"456"}]}' http://{host_name}:8080/path_to_resource

Ответ 1

Если вы не возражаете изменить подпись своего метода:

import org.json.JSONArray;

    //The resource look like this
    @Path("/path")
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public void setJsonl(String array){
        JSONArray o = new JSONArray(last_data);
        System.out.println(o.toString());

Ответ 2

поздний ответ, но может быть полезен для других Опубликовать это:

[{ "tag": "abc", "value": "ghi" }, { "tag": "123", "value": "456" }]

Потому что, отправив это:

{ "SomeObj": [{ "tag": "abc", "value": "ghi" }, { "tag": "123", "value": "456" }]}

вы отправляете объект с единственным свойством "SomeObj" named. вы не отправляете массив

Ответ 3

Попробуйте обернуть массив JSON внутри объекта, например:

@XmlRootElement 
public class SomeObjListWrapper {
private List<SomeObj> list;
// getters and setters
}

curl -X POST -H "Content-Type: application/json" -d '{"list":[{"tag":"abc", "value":"ghi"},{"tag":"123", "value":"456"}]}' http://{host_name}:8080/path_to_resource

Ответ 4

На стороне сервера:

import _root_.org.codehaus.jettison.json.{JSONArray, JSONObject}
@POST
@Path("/wants-json-array")
@Consumes(Array(MediaType.APPLICATION_JSON))
def wantsJSONArray(array: JSONArray): Response =
{
    // here your array
}

И на стороне клиента:

$.ajax(
{
    type: "GET",
    url: '/your-web-service/wants-json-array',
    data: JSON.stringify(THEARRAYYOUARESENDINGTOTHESERVER),
    contentType: "application/json",
    dataType: "json",
    processData: false
});