Play框架renderJSON问题

7

我是Play框架的新手,遇到了渲染JSON对象的问题。

public static void LoginFail() {

 Object[][] statusArray = {

   {"Status", "401"},
   {"Message", "Unauthorized"},
         {"Detail", "No API Key Supplied"}

    };

 renderJSON(statusArray);

}

这只显示了[[{},{}],[{},{}],[{},{}]],我做错了什么? 我找不到任何可靠的文档。 我尝试配置Application.LoginFail(format:'json') 的路由,但没有效果。

4个回答

14

通过创建一个StatusMessage对象,以简单且可重复使用的方式来实现它。

public class StatusMessage {
   public String status;
   public String message;
   public String detail;

   public StatusMessage(String status, String message, String detail) [
      this.status = status;
      this.message = message;
      this.detail = detail;
   }
}

然后

renderJSON(new StatusMessage("401", "Unauthorized", "No API Key Supplied"));

注意,这个类应该是公共的。它不适用于内部类和在方法内声明的类。 - Anton

11

从你的代码看,似乎你正试图使用一个类型为Object的数组自己创建一个JSON字符串。我唯一猜测这不起作用的原因是GSON(play使用的JSON库)不知道如何将其转换为键值对(尽管你的数组是二维的)。那么把statusArray改为String类型,并将其内容更改为:

{
    "Status": "401",
    "Message": "Unauthorized",
    "Detail": "No API Key Supplied"
}

将其放入renderJSON(statusArray)中,你就可以正常使用了。

作为一种替代方案,您可以创建一个简单的.json模板,如下所示:

{
    "Status": ${status},
    "Message": ${message},
    "Detail": ${detail}
}

您可以通过 render(status, message, detail) 从控制器方法调用它。这里的statusmessagedetail也是字符串。示例控制器方法:

public static void loginFail(final String status, final String message, final String detail) {
    render(status, message, detail);
}

你的模板将被称为loginFail.json(控制器方法的名称)。这样,你可以在任何需要验证登录的逻辑中调用控制器方法。一旦登录失败,你可以通过调用loginFail方法指定失败原因(通过状态、消息和详细信息)。


3
值得注意的是,renderJSON还可以接受一个字符串参数,这将绕过GSON解析。如果您使用像Jackson这样的工具进行JSON解析,则此功能非常有用(正如我所做的那样)。 - Jason Nichols

0

在这种情况下最好使用 HashMap:

public static void LoginFail() {
    Map<String, String> status = new HashMap<String, String>();

    status.put("Status", "401");
    status.put("Message", "Unauthorized");
    status.put("Detail", "No API Key Supplied");

    renderJSON(status);
}

你也可以使用另一种策略,即定义一个对象,其中包含你想要返回和呈现的定义:

public class Status{

    public String status, message, detail;

    public Status(String status, String message, String detail){
        this.status = status;
        this.message = message;
        this.detail = detail;
    }
}

public static void LoginFail(){
    Status status = new Status("401", "Unauthorized", "No API Key Supplied");

    renderJSON(status);
}

0

以下是你可以做的

import play.libs.Json;

如果您正在从浏览器作为HTTP正文读取JSON,则
 JsonNode json = request().body().asJson();     
 Program program  = Json.fromJson(json, Program.class);

这里的Program可以是你的实体类或数据传输对象。

如果你需要获取记录并以JSON格式发送到浏览器,则按照以下步骤操作:

  Program program = ProgramDAO.findById(id);
        if(program!=null){
            result = ok(Json.toJson(program));
        }

希望这能帮到你


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接