コントローラーから JsonArray (gson) を受け取るグルーヴィーなテンプレートがあります。私がやりたいことは、その配列に含まれる JsonObjects からの情報の一部で満たされた HTML を生成することです。このようなもの(わかりやすくするために簡略化しています):
<ul>
#{list items: sections, as:'section'}
<li>${section.getAsJsonObject().get("title").getAsString()}
<ul>
#{list items: section.getAsJsonObject().getAsJsonArray("articles"), as:'article'}
<li><a href="${article.getAsJsonObject().get("url").getAsString()}">${article.getAsJsonObject().get("title").getAsString()}</a></li>
#{/list}
</ul>
</li>
#{/list}
</ul>
getAsJsonWhatever() 全体を常に実行しなければならないのは非常に不便です。代替手段を知っていますか?
以下は私が探している答えではないことに注意してください。
- jsonをクライアントに送信し、javascriptで実行します
- コントローラーのコードでそれを行う
- %{ }% タグ内のコードでそれを行う
- コントローラーでjsonオブジェクトをjavaオブジェクトに変換し、これをテンプレートに渡します(ただし、これは私のお気に入りの代替手段です)
編集:解決策
Seb のソリューションを適用した後の結果は次のようになります。
コントローラ:
Object json = slurper.parseText(response.getString());
render(json);
テンプレート:
<ul>
#{list items: json.data.publication.sections, as:'section'}
<li>${section.title}
<ul>
#{list items: section.articles, as:'article'}
<li><a href="${article.url}">${article.title}</a></li>
#{/list}
</ul>
</li>
#{/list}
</ul>