【问题标题】:Play Framework renderJSON Issue播放框架 renderJSON 问题
【发布时间】:2010-09-16 00:39:19
【问题描述】:

我是 Play Framework 的新手,在渲染 JSON 对象时遇到了问题。

public static void LoginFail() {

 Object[][] statusArray = {

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

    };

 renderJSON(statusArray);

}

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

【问题讨论】:

    标签: java json playframework


    【解决方案1】:

    通过创建一个 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"));
    

    【讨论】:

    • 注意,这个类应该是公开的。它不适用于我在方法内部声明的内部类和类
    【解决方案2】:

    从您的代码看起来,您似乎正在尝试使用 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 方法来指定原因(通过状态、消息和详细信息)。

    【讨论】:

    • 另外值得注意的是,renderJSON 也可以接受一个字符串参数,它绕过了 GSON 解析。如果您使用 Jackson 之类的东西进行 JSON 解析(就像我一样),这很有用。
    【解决方案3】:

    在这种情况下最好使用 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);
    }
    

    【讨论】:

      【解决方案4】:

      你可以这样做

      import play.libs.Json;
      

      如果您从浏览器读取 JSON 作为 HTTP 正文,那么

       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));
              }
      

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-09
        • 2023-03-22
        • 1970-01-01
        • 2012-04-07
        • 1970-01-01
        • 1970-01-01
        • 2012-05-30
        相关资源
        最近更新 更多