Twig の json_encode フィルタの Tips

Craft CMS に限った話ではないですが、Twig の json_encodeフィルタに関する Tips をご紹介します。Tips と言っても、ただオプションを渡せるよという話ですし、ドキュメントにも書いてありますが、意外と知らない人もいるかなと思いまして。。。

json_encode フィルタ

例えば data という変数があったとすると、その data を JSON に変換して出力するときは {{ data|json_encode }} とすればOKですね。

{% set data = {'foo': 'こんにちは。', 'bar': 'さようなら。'} %}
{{ data|json_encode }}

出力結果 ---

{"foo":"\u3053\u3093\u306b\u3061\u306f\u3002","bar":"\u3055\u3088\u3046\u306a\u3089\u3002"}

しかし、この data が日本語などのマルチバイト文字を含んだ配列やオブジェクトだったりすると、上記のようにマルチバイト文字はエンコードされて出力されてしまいます。場合によってはエンコードされないで読める形で出力してほしい場合があります。

そういったときは json_encode フィルタに下記のようにしてオプションを渡します。

{% set data = {'foo': 'こんにちは。', 'bar': 'さようなら。'} %}
{{ data|json_encode(constant('JSON_UNESCAPED_UNICODE') }}

出力結果 ---

{"foo":"こんにちは。","bar":"さようなら。"}

まだダブルクオーテーションがエンコードされているので raw フィルタを追加します。

{% set data = {'foo': 'こんにちは。', 'bar': 'さようなら。'} %}
{{ data|json_encode(constant('JSON_UNESCAPED_UNICODE'))|raw }}

出力結果 ---

{"foo":"こんにちは。","bar":"さようなら。"}

もうちょっと見た目を整えたい場合は JSON_PRETTY_PRINT オプションを渡します。複数のオプションを渡すときは b-or 演算子を利用します。

{% set data = {'foo': 'こんにちは。', 'bar': 'さようなら。'} %}
{{ data|json_encode(constant('JSON_UNESCAPED_UNICODE') b-or constant('JSON_PRETTY_PRINT'))|raw }}

出力結果 ---

{
    "foo": "こんにちは。",
    "bar": "さようなら。"
}

オプションで渡せるものは下記のドキュメントを参照してください。