3

我正在开发 Play 1.2.4。
我已经设置了这样的路线:

POST    /index    Application.index(format:'json')

控制器是这样的:

public static void index(String json) {

    Logger.info("content type: %s", request.contentType);
    Logger.info("json string: %s", json);
    MyObj obj = new Gson().fromJson(json, MyObj.class);
    ...
    ...
}

我的 curl 请求是这样的:

curl -v -H "Content-Type: application/json" -X POST -d '{"name":"John Smith","email":"email@email.com","value1":"Value one","value2":"Value two","urls":[{"url":"http://www.google.ca"},{"url":"http://www.msn.ca"}]}' http://localhost:9000/index

MyObj 具有以下字段:

public String name;
public String email;
public String value1;
public String value2;
public String[] urls;

但是,控制器接收到一个 NULL 作为输入。我究竟做错了什么?有人可以告诉我如何使用 JSON POST 请求并将其转换为对象(特别是 url 数组)吗?谢谢!

4

3 回答 3

7

尝试将方法参数中的变量名称从 json 更改为 body。

public static void index(String body) {

    Logger.info("content type: %s", request.contentType);
    Logger.info("json string: %s", body);
    MyObj obj = new Gson().fromJson(body, MyObj.class);
    ...
    ...
}
于 2012-08-16T19:28:21.840 回答
2

您需要在请求中更改此内容:

[{"url":"http://www.google.ca"},{"url":"http://www.msn.ca"}]

为了这:

["http://www.google.ca","http://www.msn.ca"]

因为您的对象有一个字符串数组,否则,它将假定数组中的每个元素都是一个对象,其中包含一个名为“url”的字段(显然 String 没有该字段)

于 2012-08-16T19:34:12.553 回答
1

我的假设是因为您没有访问请求,并且您永远不会为正在访问的字符串输入值,从而为您提供 NULL 输入。

尝试通过request().body().asJson();调用访问 JSON 请求。

也看看http://www.playframework.org/documentation/2.0.1/JavaJsonRequests

它应该为您提供有关如何操作 JSON 请求的可靠想法。

于 2012-08-16T19:23:11.617 回答