在Play 2中使用json

时间:2012-05-06 14:12:30

标签: json playframework playframework-2.0

我正在尝试创建一个简单的应用程序,允许我创建,读取,更新和删除各种用户。我有一个基本的基于UI的视图,控制器和模型,但希望比这更高级,并提供RESTful json接口。

然而,尽管我在Play 2文档,Play 2 Google网站和stackoverflow网站上阅读了我能找到的所有内容,但仍然无法让它发挥作用。

我已根据之前的反馈更新了我的控制器,现在我相信它是基于文档的。

这是我更新的控制器:

package controllers;

import models.Member;

import play.*;
import play.mvc.*;
import play.libs.Json;
import play.data.Form;

public class Api extends Controller {

/* Return member info - version to serve Json response */
public static Result member(Long id){
  ObjectNode result = Json.newObject();
  Member member = Member.byid(id);
    result.put("id", member.id);
    result.put("email", member.email);
    result.put("name", member.name);
    return ok(result);
}

// Create a new body parser of class Json based on the values sent in the POST
@BodyParser.Of(Json.class)
public static Result createMember() {
    JsonNode json = request().body().asJson();
    // Check that we have a valid email address (that's all we need!)
    String email = json.findPath("email").getTextValue();
    if(name == null) {
        return badRequest("Missing parameter [email]");
    } else {
        // Use the model's createMember class now
        Member.createMember(json);
        return ok("Hello " + name);
    }
}

....

但是当我运行它时,我收到以下错误:

incompatible types [found: java.lang.Class<play.libs.Json>] [required: java.lang.Class<?extends play.mvc.BodyParser>]
In /Users/Mark/Development/EclipseWorkspace/ms-loyally/loyally/app/controllers/Api.java at line 42.

41  // Create a new body parser of class Json based on the values sent in the POST
42  @BodyParser.Of(Json.class) 
43  public static Result createMember() {
44      JsonNode json = request().body().asJson();
45      // Check that we have a valid email address (that's all we need!)
46      String email = json.findPath("email").getTextValue();

据我所知,我已经从documentation复制了所以我很感激能帮助你实现这一目标。

6 个答案:

答案 0 :(得分:5)

Play 2文档中使用Json类似乎存在冲突。为了使上面的示例正常工作,使用以下导入:

import play.mvc.Controller;
import play.mvc.Result;
import play.mvc.BodyParser;                     
import play.libs.Json;
import play.libs.Json.*;                        

import static play.libs.Json.toJson;

import org.codehaus.jackson.JsonNode;           
import org.codehaus.jackson.node.ObjectNode;    

@BodyParser.Of(play.mvc.BodyParser.Json.class)
public static index sayHello() {
    JsonNode json = request().body().asJson();
    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);
    }
}

请注意在Json

中明确调用正确的@BodyParser

我不确定这是不是一个错误?但这是我能让这个例子发挥作用的唯一方法。

答案 1 :(得分:3)

导入这两个

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

根据此文档:http://fasterxml.github.io/jackson-databind/javadoc/2.0.0/com/fasterxml/jackson/databind/node/ObjectNode.html

答案 2 :(得分:2)

试试这个:

import play.*;
import play.mvc.*;
import org.codehaus.jackson.JsonNode; //Fixing "error: cannot find symbol" for JsonNode

// Testing JSON
  @BodyParser.Of(BodyParser.Json.class) //Or you can import play.mvc.BodyParser.Json
  public static Result sayHello() {
    JsonNode json = request().body().asJson();
    String name = json.findPath("name").getTextValue();
    if(name==null) {
      return badRequest("Missing parameter [name]");
    } else {
      return ok("Hello " + name);
    }
  }

答案 3 :(得分:1)

AFAIK,您使用的代码未达到任何官方Play版本(无论是2.0还是2.0.1):https://github.com/playframework/Play20/pull/212

相反,你可以这样做(未经测试):

if(request().getHeader(play.mvc.Http.HeaderNames.ACCEPT).equalsIgnoreCase("application/json")) {

答案 4 :(得分:0)

您是否尝试过查看documentation了吗?

提供JSON响应如下:

@BodyParser.Of(Json.class)
public static index sayHello() {
  JsonNode json = request().body().asJson();
  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);
  }
}

答案 5 :(得分:0)

您已导入play.libs.Json,然后使用此BodyParser.Of Json.class注释。

上述注释需要一个扩展play.mvc.BodyParser的类。因此,只需将@BodyParser.Of(Json.class)替换为@BodyParser.Of(BodyParser.Json.class)