日期:2014-05-16  浏览次数:20352 次

Play framework 2.0 -Json处理

?

#JSON请求的处理和服务

?

1.处理Json请求

?

Json请求是使用有效Json数据作为Http请求的请求体的。它的Content-type头必须指定为"text/json"或者"application/json"MIME类型。

默认的,一个动作使用any content 体解析器,你可以把请求(响应)体以Json格式取回来。

?

public static index sayHello() {
	  JsonNode json = request().body().asJson();
	  if(json == null) {
	    return badRequest("Expecting Json data");
	  } else {
	    String name = json.findPath("name").getTextValue();
	    if(name == null) {
	      return badRequest("Missing parameter [name]");
	    } else {
	      return ok("Hello " + name);
	    }
	  }
	}
?

?

?

?

当然了,指定我们自己的BodyParser来让Play把内容体直接解析为Json是更好的方式:

@BodyParser.Of(Json.class)
	public static index sayHello() {
	  String name = json.findPath("name").getTextValue();
	  if(name == null) {
	    return badRequest("Missing parameter [name]");
	  } else {
	    return ok("Hello " + name);
	  }
	}
?

注:对于非Json的请求,400 Http响应会被自动返回。

?

你可以在命令行下用curl命令测试:

curl 
	  --header "Content-type: application/json" 
	  --request POST 
	  --data '{"name": "Guillaume"}' 
	  http://localhost:9000/sayHello
?

它返回:

HTTP/1.1 200 OK
	Content-Type: text/plain; charset=utf-8
	Content-Length: 15

	Hello Guillaume
?

?

2.Json响应的服务

?

在以前的例子中我们处理Json请求,但是返回一个"text/plain"的响应。现在我们来发送会一个有效的JsonHttp响应:

@BodyParser.Of(Json.class)
	public static index sayHello() {
	  ObjectNode result = Json.newObject();
	  String name = json.findPath("name").getTextValue();
	  if(name == null) {
	    result.put("status", "KO");
	    result.put("message", "Missing parameter [name]");
	    return badRequest(result);
	  } else {
	    result.put("status", "OK");
	    result.put("message", "Hello " + name);
	    return ok(result);
	  }
	}
?

现在它的响应是:

HTTP/1.1 200 OK
	Content-Type: application/json; charset=utf-8
	Content-Length: 43

	{"status":"OK","message":"Hello Guillaume"}
?

?