こんにちは。リノです。
この記事ではJson_encodeの使い方を始めて使ってみる方に向けて解説しています。また、json_encodeの使い方だけなく、実際の処理やオプションなどについても触れています。
JSONの概要
JSON(Javascript Object Notation)はデータを送受信するためのフォーマットの一種で、文字列・論理値・配列・オブジェクトなどを扱えます。
以下にJSON形式で作られたオブジェクトの例を簡単にあげておきます。boku、1、c、d、eはそれぞれオブジェクトのフィールド名を示しています。
1 |
{"boku":”rino”,"1":”ichi”,"c":3,"d":4,"e":5} |
ちなみに、エンコーディングする前のPHP側での元のオブジェクトは、こんな形です。下記のコードで使われているstdClassはPHPに元から組み込まれているクラスで、必要に応じて自動的に呼び出されます。
1 |
object(stdClass)#1 (5) { ["boku"]="rino" ["1"]="ichi" ["c"]=int(3) ["d"]=int(4) ["e"]=int(5) } |
では、簡単にどんな物かお伝えしたので、具体的な使い方を見ていきましょう。
Json_encodeの使い方(配列)
PHPの公式ドキュメントによると、json_encodeは以下のように定義されています。
string json_encode ( mixed $value [, int $options = 0 [, int $depth = 512 ]] )
公式ドキュメントの内容だけでは、わかりにくいので具体的に解説していきます。そもそも、配列には連想配列(キーが文字列の配列)とインデックス配列(キーが数字のみの配列)があるのですが、前者の連想配列をjson_encodeする場合には注意が必要です。
なぜなら、「Jsonには連想配列がない」からです。そのため、Jsonではオブジェクトを用いて連想配列を表現しなければなりません。
1 2 3 4 5 |
$arr1 = array('a' =; 1, 'b' =; 2, 'c' =; 3, 'd' ; 4, 'e' ; 5); echo json_encode($arr1); //結果 {"a":1,"b":2,"c":3,"d":4,"e":5} |
ここで使われている「 { 」と「 } 」はJsonのオブジェクトの開始と終了を意味します。aがプロパティ、1がその値・・・という風に一つ一つオブジェクトを用いて定義されています。
連想配列の処理を解説したので、次はインデックス配列をjson_encodeを用いてエンコーディングします。インデックス配列は連想配列とは違い、配列のままエンコーディングが出来ます。
1 2 3 4 5 |
$arr1 = array(1, 2, 3, 4, 5); echo json_encode($arr1); //結果 [1,2,3,4,5] |
オブジェクトの場合は、「 { 」、「 } 」でオブジェクトを表しましたが、配列の場合は「 [ 」、「 ] 」で表します。
補足ですが、連想配列・インデックス配列をjson_encodeする際には注意点があります。それは、「Jsonではオブジェクトのキーは必ずダブルクォートで括って文字列にしなければならない」です。
PHPでオブジェクトを作る場合には、シングルクォートで括って文字列を作っても良いですが、Jsonの場合にはそれでは動作しません。したがって、
1 |
{‘a’:1,’b’:2,’c’:3,’d’:4,’e’:5} |
のように、文字列をシングルクォートで括ると動作しないので、ダブルクォートで括るようにしましょう。
Json_encodeの使い方(文字列)
ここからは文字列をjson_encodeしながら、オプションなどを解説していきます。
まずは、ただの英数字をエンコードしてみます。
1 2 3 4 5 |
$arr3 = "aa11"; echo json_encode($arr3); //結果 "aa11" |
英数字をエンコードした場合は、そのまま出力されます。次は、日本語をエンコードしてみます。
1 2 3 4 5 |
$arr4 = "あああ"; echo json_encode($arr4); //結果 "\u3042\u3042\u3042" |
日本語をエンコードした場合には、Javascriptでエスケープするために使われるunicodeで変換された後の値が出力されます。
これを回避するには、json_encodeの引数にJSON_UNESCAPED_UNICODEを使い、正しく出力されるようにします。
1 2 3 4 5 |
$arr5 = "あああ"; echo json_encode($arr5,JSON_UNESCAPED_UNICODE); //結果 "あああ" |
JSON_UNESCAPED_UNICODEを使ったことで無事、文字列が出力されるようになりました。
次の章からは、JSON_UNESCAPED_UNICODEのように、json_encodeの第二引数に設定することでjson_encodeの処理を変更することのできる関数についてお伝えします。
json_encodeのデータ変換関数について
Json_encodeでは、第二引数にオプションを指定することで、処理を変更できるようになります。例えば、以下のようなオプションがあります。
JSON_HEX_TAG (integer)
すべての「 < 」および「 > 」をそれぞれ \u003C および \u003E に変換する。JSON_HEX_AMP (integer)
すべての「 & 」を \u0026 に変換する。JSON_HEX_APOS (integer)
すべての ‘ を \u0027 に変換する。JSON_HEX_QUOT (integer)
すべての ” を \u0022 に変換する。
ではまず、オプションを使用せずに”a\”a\”a”の文字列をjson_encodeしてみます。このとき、ダブルクォートである「”」はそのまま出力されてしまいます。
1 2 3 4 5 |
$arr = "a\"a\&a"; echo json_encode($arr); //結果 "a\"a\&a" |
次に、オプションを用いて、”をエスケープします。
1 2 3 4 5 |
$arr = "a\"a\&a"; echo json_encode($arr,JSON_HEX_QUOT); //結果 "a\u0022a\&a" |
エスケープしたことで、”がu0022に変わりました。
なお、これらの関数を利用するときは、「 | 」を用いることで複数のオプションをセットできます。次の例では、上記のコード例でエスケープしていなかった「 & 」もJSON_HEX_AMP関数を用いてエスケープします。
1 2 3 4 5 |
$arr = "a\"a\&a"; echo json_encode($arr,JSON_HEX_QUOT | JSON_HEX_AMP); //結果 "a\u0022a\\\u0026a" |
以上のように、JSON_HEX_QUOT、そしてJSON_HEX_AMPを用いることで「 ” 」が「u0022」にエスケープされ、「 & 」も「u0026」にエスケープされました。
まとめ
今回は、Json_encodeの使い方についてお伝えしました。
具体的には、
・JSONの概要
・json_encodeの使い方
・json_encodeのデータ変換関数
についてお伝えしました。
データを送受信する際には、jsonを使うことが多いので、この記事で是非jsonのエンコーディング方法を覚えて頂けたのでしたら幸いです。