2010-09-16 18 views
8

Ich bin neu in Play Framework und Probleme beim Rendern eines JSON-Objekts.Play Framework renderJSON Problem

public static void LoginFail() { 

Object[][] statusArray = { 

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

    }; 

renderJSON(statusArray); 

} 

dies nur zeigt [[{},{}],[{},{}],[{},{}]] ... was mache ich falsch? Ich kann dazu keine solide Dokumentation finden. Ich habe versucht, die Route für Application.LoginFail(format:'json') zu konfigurieren, aber das hat nichts getan.

Antwort

11

Von den Blicken des Codes scheint es, dass Ihr einen JSON-String selbst die erstellen versuchen, ein Array vom Typ Object verwenden. Meine einzige Vermutung, warum dies nicht funktioniert, ist, dass GSON (die JSON-Bibliothek, die von play verwendet wird) nicht weiß, wie man das in Schlüssel/Wert-Paare umwandelt (obwohl Ihr Array zweidimensional ist). So wie über das Ändern statusArray zu String und seinen Inhalt:

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

setzen, die in renderJSON(statusArray) und Sie sollten in Ordnung sein.

Als Alternative Sie eine einfache .json Vorlage wie folgt erstellen konnte:

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

und es von einem Controller-Methode über render(status, message, detail) nennen. status, message und detail Strings auch hier. Beispiel Controller-Methode:

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

und Ihre Vorlage würde loginFail.json (der Name der Controller-Methode) aufgerufen werden. Auf diese Weise können Sie die Controller-Methode in beliebiger Logik aufrufen, um die Anmeldung zu bestätigen. Sobald die Anmeldung fehlschlägt, geben Sie an, warum dies der Fall ist (über Status, Nachricht und Details), indem Sie die Methode loginFail aufrufen.

+3

Es ist auch erwähnenswert, dass renderJSON als auch ein String-Argument nehmen kann, was umgeht das GSON-Parsing. Dies ist nützlich, wenn Sie etwas wie Jackson für Ihre JSON-Analyse verwenden (so wie ich). –

14

es die einfache & wiederverwendbare Art und Weise tun, indem ein Statusmessage Objekt

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

erstellen und dann

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

Hinweis, diese Klasse sollte öffentlich sein. Es funktioniert nicht für innere Klasse und Klasse, die innerhalb der Methode deklariert wurde – Anton

0

das beste in diesem Fall eine HashMap verwendet wird:

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

Sie kann auch eine andere Strategie verwenden, nämlich ein Objekt mit der Definition dessen, was Sie sind, zu definieren dies zurückkehren wollen und machen:

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

Hier ist, was Sie

import play.libs.Json; 

tun können, wenn Sie JSON von Browser als HTTP-Body lesen, dann

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

Hier Programm kann Ihre Entitätsklasse oder Datentransportobjekt.

Wenn Sie Datensätze holen müssen und es zu Browser in JSON senden Sie dann wie unten

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

Hope this

hilft