2012-03-09 17 views
17

JSON形式でデータをレンダリングするには、次のコードを使用します。 Uは、上記参照のようgrailsでのJSONのレンダリング

render(contentType:"text/json") { 
    results = array { 
     db.eachRow(query) { row -> 
      def rs = row.toRowResult() 
      def a = b(rs.name,c,d) 
      aMap.put("A",a) 
      pair(aMap) 
     } 
    } 
    if (results) { 
     status = "OK" 
    } 
    else { 
     status ="Nothing present" 
    } 
} 

上記のコードは、データをオブジェクトのアレイとしてレンダリングされ、次の形式

{ 
    "results": [ 
     {"A":"value1"}, 
     {"A":"value2"}, 
     ................... 
     {"A":"valuen"} 
    ], 
    "status":"OK" 
} 

でJSONを生成します。結果データを要素の配列としてレンダリングできる方法はありますか?同様に少しだけによってオフ

{ 
    "results": [ 
     "value1", 
     "value2", 
     ................... 
     "valuen" 
    ], 
    "status":"OK" 
} 

答えて

35

JSONオブジェクトの構築方法はかなりわかりません。 JSONレスポンスをgrailsでレンダリングするのが好きなのは、groovyでマップやリストを作成してから、renderメソッドをJSONに変換するだけです。 renderメソッド内rowResult年代の変換を行う

私はむしろ、私はそれが読みやすく、そしてより短いと思うこの

def results = db.rows(query).collect { rowResult -> 
    b(rowResult.name, c, d) 
} 
render(contentType: 'text/json') {[ 
    'results': results, 
    'status': results ? "OK" : "Nothing present" 
]} 

ような何かのために行くだろう、それは非常に混乱します。このスニペットは、あなたが望む結果を得ます:results配列内のオブジェクトはなく、文字列だけです。

rowsを使用することに注意してください。これはRowResultのリストを返し、結果セットから取得する必要はありません。このリストは、各行の名前にbを呼び出して、変換された値aを収集するために使用されます。要素を収集しても、マップを作成することを意味するわけではありません({ "A":"value1"} JSONのように)、<<演算子を新しい空のリストに入れて同じ@ will-buckを達成しただけです。

text/jsonコンテンツタイプを宣言し、レスポンスに書きたいresultsstatusというキーを含むリテラルマップを渡すだけです。条件演算子は、状態を簡潔に決定するために使用されます。また、JSONコンバータ@See-Buckもこのように使用することができます:

def responseData = [ 
    'results': results, 
    'status': results ? "OK" : "Nothing present" 
] 
render responseData as JSON 
+1

私はあなたの最後のコードスニペットが最初のものより優れています。おそらくデバッガとの親和性も高いでしょう。 – epidemian

+0

ええと、そのJSONコンバーターは確かに行く方法です:) –

+1

Grails 2.0の最後のスニペットに問題があります。応答は '{}'で囲まれたテキストとしてレンダリングされます。 – raffian

4

は:)ジャストコレクションまたはリストではなく、マップする

aMap.put("A", a) 

を変更する必要があります。なので

def aList = [] 
aList << a 

あなたが望むものを手に入れよう!

サイドノートとして、grailsにJSONコンバーターがあり、それはあなたのためにその文字列ビルディングを行います。それを見てくださいhere

関連する問題