2010-09-16 19 views
8

Soy nuevo en Play Framework y tengo problemas para representar un objeto JSON.Reproducir Framework renderJSON Issue

public static void LoginFail() { 

Object[][] statusArray = { 

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

    }; 

renderJSON(statusArray); 

} 

Solo muestra [[{},{}],[{},{}],[{},{}]] ... ¿qué estoy haciendo mal? No puedo encontrar ninguna documentación sólida sobre esto. Intenté configurar la ruta para Application.LoginFail(format:'json'), pero esto no hizo nada.

Respuesta

11

Desde el aspecto de su código, parece que está intentando crear una cadena JSON usted mismo, utilizando una matriz de tipo Object. Mi única conjetura sobre por qué esto no funciona es que GSON (la biblioteca JSON en uso por juego) no sabe cómo convertir eso en pares clave-valor (aunque su matriz es bidimensional). Entonces, ¿cómo trata de cambiar a statusArray cadena y su contenido a:

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

poner esto en renderJSON(statusArray) y que debe estar bien.

Como alternativa se podría crear una plantilla simple .json como la siguiente:

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

y llamaremos a partir de un método de control a través render(status, message, detail). status, message y detail siendo Strings aquí también. Ejemplo método controlador:

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

y su plantilla sería llamado loginFail.json (el nombre del método de controlador). De esta forma puede llamar al método del controlador en cualquier lógica que tenga para verificar el inicio de sesión. Una vez que el inicio de sesión falla, especifique por qué eso (a través del estado, el mensaje y los detalles) llamando al método loginFail.

+3

Es también digno de mención que renderJSON puede tomar un argumento de cadena, así, que no pasa por el análisis GSON. Esto es útil si utiliza algo como Jackson para su análisis JSON (como hago yo). –

14

hacerlo de la sencilla & manera reutilizable mediante la creación de un objeto 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; 
    } 
} 

Y luego

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

Nota, esta clase debe ser pública. No funciona para mí para clase interna y clase, eso fue declarado dentro del método – Anton

0

el mejor en este caso se utiliza un 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); 
} 

Usted también puede usar otra estrategia, que es definir un objeto con la definición de lo que querrá volver y hacer esto:

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

Aquí es lo que puede hacer

import play.libs.Json; 

Si está leyendo JSON desde un navegador como HTTP Cuerpo continuación

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

Aquí programa puede ser su clase de entidad u objeto de transporte de datos.

continuación Si tiene que ir a buscar los registros y enviarlo al navegador en JSON hacer como abajo

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

Esperanza esto ayuda