5

今日、Grails 2.0.4 でオブジェクトのリストを JSON としてレンダリングしようとして、この奇妙な結果に出くわしまし...予測は正しかった。以下を参照:-))

これは正常に機能します。JSONはブラウザで正しくレンダリングされます...

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

..では、なぜこの短縮版は機能しないmodelのでしょうか?

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

上記のコードから得られた JSON は 1 行のテキストとして出力されるため、 を取得していないと思われますas JSONが、正しく括弧で囲まれています。

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

4

4 に答える 4

8

これは の正常な動作ですrenderrender次のように中括弧なしで引数を指定すると

render model as JSON

content-typeto を設定する暗黙の調整を行いますtext/json。しかし、後者の場合、あなたは無意識のうちに[ render が法線を使用するようにしたrender後、最初のブレースにマークを付ける]のようにブレースを使用するようにしました。renderrender()

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

上記の場合、名前付きパラメーターを渡して、またはなどにrender言及する必要があります。そのため、ブラウザー/ビューでインライン コントロール ロジックを JSON としてレンダリングするには、以下のようにする必要があります。contentTypetextmodelstatus

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

content-typeとしても使えますtext/json。私は好きapplication/jsonです。

UPDATE
代替の最も簡単な方法:
render([products: (products ?: "No products found")] as JSON)

于 2013-05-26T00:39:21.503 に答える
3

ここでの問題の本質は、groovy コンパイラーが解釈することです。

render x as JSON

意味する

render (x as JSON)

しかし、それは解釈します

render (x) as JSON

意味する

(render x) as JSON

メソッド名 (この場合renderは ) の直後に左括弧が続く場合、一致する右括弧までのコードのみが引数リストと見なされます。これが、言うために余分な括弧のセットが必要な理由です

render ((x) as JSON)
于 2013-05-26T18:38:59.250 に答える
1

理由がわからない。次のように使用してみてください。

render(contentType: 'text/json') {[
    'products': products ? : "No products found"
]}
于 2013-05-26T00:00:16.463 に答える
1

何をするかというと、( ) 内のパラメーターを使用して render を呼び出し、結果に "as JSON" を適用することです!

括弧を省略することは、メソッド呼び出しの単なるショートカットですが、同じ規則が適用されることを忘れないでください。

于 2013-05-26T00:49:11.010 に答える