2013-05-25 4 views
5

Kam heute über dieses merkwürdige Ergebnis und versuchte, eine Liste von Objekten als JSON in Grails 2.0.4 zu rendern ... (Ich weiß, ich werde es bereuen zu fragen das wegen etwas rechts unter meiner Nase ... aktualisiert 5/26, meine Vorhersage war korrekt, siehe unten :-))Rendern von 'als JSON' in Grails mit Bedingungsoperator wird nicht korrekt dargestellt

Das funktioniert gut; die JSON macht richtig im Browser ...

def products = [] //ArrayList of Product objects from service  
def model = (products) ? [products:products] : [products:"No products found"] 
render model as JSON 

..so warum nicht diese verkürzte Version ohne model Arbeit?

def products = []  
render ((products) ? [products:products] : [products:"No products found"]) as JSON 

Das resultierende JSON aus dem obigen Code-Ausgabe als einzelne Textzeile ist, so dass ich vermute, dass es as JSON Abholung nicht ist, aber es ist richtig eingeklammert, so was ist das Problem?

[ 'Produkte': [com.test.domain.Product: null, com.test.domain.Product ...]

Antwort

8

Dies ist ein normales Verhalten von render. Wenn Sie Argumente an render ohne Klammern wie

render model as JSON

Es bieten macht eine implizite Anpassung der content-type-text/json einrichten. Aber im letzteren Fall haben Sie unwissentlich die render gemacht, um die Klammern wie [Markierung auf der ersten Klammer nach render Gebrauch macht machen die normalen render()] verwenden

render ((products) ? [products:products] : [products:"No products found"]) as JSON.

Im obigen Fall, müssen Sie render in den genannten Parameter übergeben die Erwähnung contentType, text oder model, status etc. Also, um die Inline-Steuerlogik als JSON in Browser/sehen Sie tun müssen, um zu machen, wie unten:

render(contentType: "application/json", text: [products: (products ?: "No products found")] as JSON) 

können Sie auch content-type als text/json verwenden. Ich bevorzuge application/json.

UPDATE
Alternative einfachste Weg:
render([products: (products ?: "No products found")] as JSON)

+0

Damnit zu sagen, ich bin Aufruf 'render()', ohne es zu merken, thx, ich am Ende mit dieser unter Verwendung von Elementen Ihrer Lösung gehen, es ist ein etwas kürzer und vermeidet die Angabe des Inhaltstyps zweimal: 'render (contentType:" text/json ") {[produkte: (produkte?:" Keine produkte gefunden ")]}' – raffian

+4

Das würde auch funktionieren: 'render ((products ? [Produkte: Produkte]: [Produkte: "Keine Produkte gefunden"]) als JSON) ' –

+0

@JamesKleeh Ace im Loch, schön! .. und genau das, was ich gesucht habe! – raffian

1

Sie kennen den Grund nicht. Versuchen Sie, wie diese zu nutzen:

render(contentType: 'text/json') {[ 
    'products': products ? : "No products found" 
]} 
1

Was Sie Aufruf mit den Parametern in() übertragen wird, und dann die Anwendung "wie JSON" auf das Ergebnis!

Vergessen Sie nicht, dass das Verlassen der Klammern nur eine Abkürzung für einen Methodenaufruf ist, aber die gleichen Regeln gelten weiterhin.

3

Das Wesen des Problems ist, dass die groovy Compiler interpretiert

render x as JSON 

render (x as JSON) 

bedeuten, aber es deutet

render (x) as JSON 

bedeuten

(render x) as JSON 

Wenn auf einen Methodennamen (in diesem Fall render) sofort eine öffnende Klammer folgt, wird nur Code bis zur passenden schließenden Klammer als Argumentliste betrachtet. Dies ist, warum Sie einen zusätzlichen Satz von Klammern brauchen

render ((x) as JSON) 
Verwandte Themen