2013-05-25 5 views
5

今日この奇妙な結果が、Grails 2.0.4でJSONとしてオブジェクトのリストをレンダリングしようとしています...(私は、これは私の鼻の下の何かのために... 更新 5/26、私の予測は正しいです:-))条件演算子を使ったGrailsの 'JSONとしてのレンダリング'が正しくレンダリングされない

これは問題なく動作します。 JSONは

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

..so ...ブラウザで正しくレンダリングしないのはなぜmodel作業なしで、この短縮版?上記のコードから

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

結果のJSONはテキストの単一行として出力されるので、私はそれがas JSONを拾っていない疑いがあるが、それは正しく括弧ですので、契約は何ですか?

[ '製品':[com.test.domain.Product:ヌル、 com.test.domain.Product ...]

答えて

8

これは通常の動作で、renderです。あなたは

render model as JSON

のように中括弧なしrenderに引数を与えた場合にはtext/jsonからcontent-typeを設定する暗黙の調整を行います。しかし、後者の場合には、あなたは無意識のうちに

[ renderなりますが、通常の render()を使用するレンダリング後の最初のブレース上のマーク]のように括弧を使用する

render ((products) ? [products:products] : [products:"No products found"]) as JSONrenderを行いました。上記の場合

、あなたがcontentTypetextまたはmodelに言及renderに名前付きパラメータを渡す必要があり、statusなどのブラウザ/ビューでJSONとしてインラインコントロールロジックをレンダリングするために、あなたは以下のようにしなければならないので以下の下:

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

またtext/jsonとしてcontent-typeを使用することができます。私はapplication/jsonが好きです。

UPDATE
代替最も簡単な方法:あなたは()内のパラメータでレンダリング呼び出し、その後、結果に "JSONとして" 適用されない何
render([products: (products ?: "No products found")] as JSON)

+0

Damnitを言うために、括弧の余分なセットを必要とする理由は、私は 'も、それを実現することなく、THXは、私はあなたのソリューションのこの使用して要素と一緒に行くことになった、それはだ)('レンダリング呼び出すよさレンダリング(contentType: "text/json"){[products :(products?: "製品が見つかりません")]} ' – raffian

+4

これもうまくいくでしょう:' render((製品?[製品:製品]:[製品: "製品が見つかりません"])JSONとして) ' –

+0

@JamesKleeh Ace in the hole、nice!..そして私が探していたもの! – raffian

1

は、理由が分かりません。このように使用してみてください:

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

括弧を外したままにすると、メソッド呼び出しのショートカットにすぎませんが、同じ規則が適用されます。

3

ここにあなたの問題の本質は、グルーヴィーなコンパイラが

render x as JSON 

render (x as JSON) 

を意味するように解釈していることですが、それは

render (x) as JSON 

を意味すると解釈

(render x) as JSON 

メソッド名(この場合はrender)の直後に開き括弧が続く場合、一致する閉じ括弧までのコードのみが引数リストと見なされます。あなたは

render ((x) as JSON) 
関連する問題