2010-09-16 3 views
8

Я новичок в Play Framework и испытываю трудности с рендерингом объекта JSON.Play Framework renderJSON Issue

public static void LoginFail() { 

Object[][] statusArray = { 

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

    }; 

renderJSON(statusArray); 

} 

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

ответ

11

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

{ 
    "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.

+3

Стоит также отметить, что renderJSON может принимать строковый аргумент, как хорошо, что минует синтаксический анализ GSON. Это полезно, если вы используете что-то вроде Jackson для разбора JSON (как и я). –

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")); 
+0

Примечание. Этот класс должен быть общедоступным. Это не работает для меня для внутреннего класса и класса, который был объявлен внутри метода – Anton

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

You может также использовать другую стратегию, которая заключается в определении объекта с определением того, что вы хотят вернуться и сделать это:

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; 

Если вы читаете JSON из браузера, как HTTP Тело затем

JsonNode json = request().body().asJson();  
Program program = Json.fromJson(json, Program.class); 

Здесь программа может быть вашим объект класса или объект передачи данных.

Если вы должны принести документы и отправить его в браузер в формате JSON, то сделать, как показано ниже

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

Надеется, что это помогает