XMLとJSON応答

4209 ワード

XMLとJSON応答

renderメソッドを使用してXMLを出力する


Grailsは、XMLおよびJSON応答を生成するためのいくつかの異なる方法をサポートする.1つ目は、renderメソッドを暗黙的に通過することです.renderメソッドは、タグジェネレータ生成XMLを生成するためにコードブロックを渡すことができる
def list = {
def results = Book.list()
render(contentType:"text/xml") {
books {
for(b in results) {
book(title:b.title)
}
}
}
}

このコードの結果は次のようになります.
<books>
<book title="The Stand" />
<book title="The Shining" />
</books>

タグジェネレータを使用する場合は、名前の競合を避けるように注意する必要があります.たとえば、このコードでエラーが発生します.
def list = {
def books = Book.list()  // naming conflict here
render(contentType:"text/xml") {
books {
for(b in results) {
book(title:b.title)
}
}
}
}

なぜなら、ここでのローカル変数booksは、メソッドとして呼び出されることを意図しているからである.

レンダー方式でJSONを出力する

renderメソッドは、JSONを出力するために同様に使用することができる.
def list = {
def results = Book.list()
render(contentType:"text/json") {
books {
for(b in results) {
book(title:b.title)
}
}
}
}

この場合、結果はほぼ同じになります.
[
{title:"The Stand"},
{title:"The Shining"}
]

同じネーミング競合の危険はJSONジェネレータに適用されます.

自動XML列セット(Marshalling)


(注:ここには、ポインタなどのデータは、別のコンポーネントに理解されるために、カラムセット(Marshalling)の解釈を添付します.カラムセット(Marshalling)はデータフォーマットの変換方法といえる.
Grailsはまた、特定の変換器を介してXMLに対する自動カラムセット(Marshalling)レルムクラスをサポートします.
まず、grails.convertersクラスパッケージをコントローラにインポートします.
import grails.converters.*

次の高度に読みやすい構文を使用して、レルムクラスをXMLに自動的に変換できます.
render Book.list() as XML

出力結果は次のように表示されます.
<?xml version="1.0" encoding="ISO-8859-1"?>
<list>
<book id="1">
<author>Stephen King</author>
<title>The Stand</title>
</book>
<book id="2">
<author>Stephen King</author>
<title>The Shining</title>
</book>
</list>

変換器を使用する代わりの方法はGrailsのcodecs特性を使用することである.codecsプロパティは、encodeAsXMLおよびencodeAsJSONメソッドを提供します.
def xml = Book.list().encodeAsXML()
render xml

 

自動JSON列セット(Marshalling)


Grailsは自動列セット(Marshalling)がJSONのために同じメカニズムを通過することをサポートしています.単純代替XMLJSON
render Book.list() as JSON

出力結果は次のように表示されます.
[
{"id":1,
"class":"Book",
"author":"Stephen King",
"title":"The Stand"},
{"id":2,
"class":"Book",
"author":"Stephen King",
"releaseDate":new Date(1194127343161),
"title":"The Shining"}
]

再び代替として、encodeAsJSONを使用して同じ効果を達成することができます.