web-dev-qa-db-ja.com

GrailsでのJSONのレンダリング

次のコードを使用して、データを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"
}
17
Shenoy Tinny

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
36
Esteban

少しだけオフ:)変更する必要があるだけ

aMap.put("A", a)

マップではなく、コレクションまたはリストにする。のようなもの

def aList = []
aList << a

あなたが欲しいものを手に入れます!

補足として、GrailsにはJSONコンバーターがあり、ストリングの作成を行います。調べてみてください ここ

5
Will Buck

これは、コントローラーからJSONをレンダリングするのに十分なはずです。

render results as grails.converters.JSON
1
IgniteCoders