PowerCMS X ブログ

2024-01-05

オブジェクトを JSONフォーマットで出力する

記事などのデータを JSON形式で出力・取得したいというケースは多いと思います。PowerCMS Xには RESTful APIがあり、JSON形式でデータの取得、オブジェクトの作成、検索などができるのですが、静的ファイルにしたいというケースもあると思います。

ビュー(テンプレート)を作成することで実現できます。記事モデルを例にして紹介します。

自前で組み立てる方法

記事のコンテキストで、各タグを使って組み立てる方法です。数字などではない文字列などの情報には escape="json"を追加します。

<mt:setvarblock name="json">
{
  "id": <mt:entryid>,
  "title" : "<mt:entrytitle escape="json">",
  "text" : "<mt:entrybody escape="json">",
  "permalink" : "<mt:entrypermalink escape="json">",
  "date":"<mt:entrydate escape="json">"
}
</mt:setvarblock>
<mt:var name="json">

出力されたJSONデータ

マルチバイト文字列を見やすくする

escape="json" の代わりに escape="json_unescaped_unicode" とすると、マルチバイト Unicode 文字をそのままの形式で扱います。

<mt:setvarblock name="json">
{
  "id": <mt:entryid>,
  "title" : "<mt:entrytitle escape="json_unescaped_unicode">",
  "text" : "<mt:entrybody escape="json_unescaped_unicode">",
  "permalink" : "<mt:entrypermalink escape="json">",
  "date":"<mt:entrydate escape="json">"
}
</mt:setvarblock>
<mt:var name="json">

ハッシュ配列を組み立てて JSON形式で出力する

sethashvarsを使うときは右辺に改行を含むことができないことに注意してください(以下の例では strip_linefeedsモディファイアで改行を削除しています)。

<mt:sethashvars name="json">
  id=<mt:entryid>
  title=<mt:entrytitle>
  text=<mt:entrybody strip_linefeeds>
  permalink=<mt:entrypermalink>
  date=<mt:entrydate>
</mt:sethashvars>
<mt:var name="json" to_json>

改行を含めたいときは、以下のようにできます。

<mt:entryid setvar="entry_id">
<mt:entrytitle setvar="entry_title">
<mt:entrybody setvar="entry_body">
<mt:entrypermalink setvar="entry_permalink">
<mt:entrydate setvar="entry_date">
<mt:setvar name="json" key="id" value="$entry_id">
<mt:setvar name="json" key="title" value="$entry_title">
<mt:setvar name="json" key="permalink" value="$entry_permalink">
<mt:setvar name="json" key="text" value="$entry_body">
<mt:setvar name="json" key="date" value="$entry_date">
<mt:var name="json" to_json>

ループで複数の記事を JSONにする

glue属性を使うことと、予約変数 __first__, __last__をうまく使うことがポイントです。

<mt:entries glue=",">
<mt:if name="__first__">
{"totalResult": <mt:var name="__total__">,
"items" : [
</mt:if>
{
  "id": <mt:entryid>,
  "title" : "<mt:entrytitle escape="json">",
  "text" : "<mt:entrybody escape="json">",
  "permalink" : "<mt:entrypermalink escape="json">",
  "date":"<mt:entrydate escape="json">"
}
<mt:if name="__last__">
] }
</mt:if>
</mt:entries>

自動的にオブジェクトを JSON形式に変換する

mt:objecttojsonタグを使うと、自動的に JSON形式に変換されます。出力形式は、RESTful API エンドポイント(get,listなど)で返却されるデータ形式となっています。

<mt:objecttojson>

取得するカラムを指定したいときは cols属性(カンマ区切りまたは配列)で指定が可能です。指定はRESTful APIが返却するキーで指定します。permalinkではなく「Permalink」であることに注意してください。

<mt:objecttojson cols="id,title,text,Permalink,published_on">

objecttojsonタグを使って記事リストを出力する例は以下のようになります。

<mt:entries glue=",">
<mt:if name="__first__">
{"totalResult": <mt:var name="__total__">,
"items" : [
</mt:if>
<mt:objecttojson cols="id,title,text,Permalink,published_on">
<mt:if name="__last__">
] }
</mt:if>
</mt:entries>

カテゴリー:テンプレート作成Tips | 技術情報 | サイト制作全般

投稿者:Junnama Noda

ブログ内検索

アーカイブ