次のコードを使用して、データを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"
}
}
上記のコードは、次の形式でJSONを生成します
{
"results": [
{"A":"value1"},
{"A":"value2"},
...................
{"A":"valuen"}
],
"status":"OK"
}
上記のように、データはオブジェクトの配列としてレンダリングされます。結果データを要素の配列としてレンダリングする方法はありますか?お気に入り
{
"results": [
"value1",
"value2",
...................
"valuen"
],
"status":"OK"
}
JSONオブジェクトの構築方法は非常に不明瞭です。 grailsでJSON応答をレンダリングするために私がしたいことは、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
配列内にオブジェクトはなく、文字列だけです。
RowResultのリストを返すrows
の使用に注意してください。これにより、ResultSetから取得する必要がなくなります。リストは、各行の名前でa
を呼び出すことにより、変換された値b
を収集するために使用されます。要素を収集することは、マップを作成することを意味しません({ "A":"value1"}
JSONのように)、新しい空のリストで<<
演算子を使用して達成したのと同じ@ will-buckです。
Renderメソッドで行うことは、text/json
コンテンツタイプを宣言し、それに応答として書き込むキーresults
およびstatus
を含むリテラルマップを渡すことです。条件演算子は、ステータスを簡潔に決定するために使用されます。また、JSONコンバーター@ will-buckを使用して、次のように使用することもできます。
def responseData = [
'results': results,
'status': results ? "OK" : "Nothing present"
]
render responseData as JSON
少しだけオフ:)変更する必要があるだけ
aMap.put("A", a)
マップではなく、コレクションまたはリストにする。のようなもの
def aList = []
aList << a
あなたが欲しいものを手に入れます!
補足として、GrailsにはJSONコンバーターがあり、ストリングの作成を行います。調べてみてください ここ
これは、コントローラーからJSONをレンダリングするのに十分なはずです。
render results as grails.converters.JSON