SymfonyでJSON出力を行う場合の注意点
Symfonyのテンプレートを使ってJSON出力を行う場合は、コンマに注意。
以下のようなJSON形式のデータがある場合、
{ "array" : [ { "name1" : "value1" }, { "name2" : "value2" } ] }
はOKですが、
{ "array" : [ { "name1" : "value1" }, { "name2" : "value2" }, ] }
は構文エラーになります。
{ "name2" : "value2" }の後にコンマがついているからです。
SymfonyのテンプレートでJSON出力をする際に、複数の要素がある場合はforeach関数を使ってループ処理を行います。
この時、配列の最後の要素の場合はコンマを出力しないという処理が必要になります。
Jobeet15日目: Web サービスに書かれているjsonフォーマットの部分を見てみると
<!-- apps/frontend/modules/api/templates/listSuccess.json.php --> [ <?php $nb = count($jobs); $i = 0; foreach ($jobs as $url => $job): ++$i ?> { "url": "<?php echo $url ?>", <?php $nb1 = count($job); $j = 0; foreach ($job as $key => $value): ++$j ?> "<?php echo $key ?>": <?php echo json_encode($value).($nb1 == $j ? '' : ',') ?> <?php endforeach ?> }<?php echo $nb == $i ? '' : ',' ?> <?php endforeach ?> ]
となっています。
ここではまず、ループ処理の前に$nb = count($jobs);で配列の要素数を変数に代入しています。
そして、現在の配列の要素番号を知るために$iを定義し、ループが実行される度に$iの値を増やしていきます。
ループ処理の最後の部分で$nbと$iを比較して、一致する場合はコンマを表示しない、という処理が行われています。
この処理を忘れると最後の要素にもコンマがついたまま出力されてしまい、JSONデータがデコードできません。
以前、PHPでJSON出力を行った時はデータの一覧を持つ配列をjson_encode関数にかけていため、自動で最後の要素はコンマが除かれていました。
JSONに対する理解が浅い状態でプログラムを書いていたため、今回、繰り返しの最後の要素にもコンマをつけて出力してしまい、構文エラーになるというミスをしていました。
中途半端な理解では後々困ることになるから気をつけようと反省。
次回はJSON形式について書こうと思います。