Play Framework renderJSON Issue - PullRequest
       3

Play Framework renderJSON Issue

7 голосов
/ 16 сентября 2010

Я новичок в Play Framework, и у меня возникают проблемы при рендеринге объекта JSON.

public static void LoginFail() {

 Object[][] statusArray = {

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

    };

 renderJSON(statusArray);

}

Это только показывает [[{},{}],[{},{}],[{},{}]] ... что я делаю не так?Я не могу найти надежную документацию по этому вопросу.Я попытался настроить маршрут для Application.LoginFail(format:'json'), но это ничего не сделало.

Ответы [ 4 ]

14 голосов
/ 17 сентября 2010

Сделайте это простым и многократно используемым способом, создав объект 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"));
11 голосов
/ 16 сентября 2010

Судя по внешнему виду вашего кода, вы пытаетесь создать строку JSON самостоятельно, используя массив типа Object. Мое единственное предположение относительно того, почему это не работает, заключается в том, что GSON (библиотека JSON, используемая play) не знает, как преобразовать это в пары ключ-значение (хотя ваш массив является двумерным). Так как насчет изменения statusArray на String и его содержимого на:

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

Поместите это в renderJSON(statusArray) и все будет хорошо.

В качестве альтернативы вы можете создать простой шаблон .json, подобный следующему:

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

и вызвать его из метода контроллера через render(status, message, detail). status, message и detail также являются строками. Пример метода контроллера:

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

и ваш шаблон будет называться loginFail.json (название метода контроллера). Таким образом, вы можете вызывать метод контроллера в любой логике для проверки входа в систему. После сбоя входа в систему вы указываете причину (через статус, сообщение и данные), вызывая метод loginFail.

0 голосов
/ 23 апреля 2015

Вот что вы можете сделать

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

Надеюсь, это поможет

0 голосов
/ 04 апреля 2013

лучшее в этом случае используется 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...