PHP/Laravel

PHPでJson_encodeを使う方法【初心者向け】

こんにちは。リノです。

この記事ではJson_encodeの使い方を始めて使ってみる方に向けて解説しています。また、json_encodeの使い方だけなく、実際の処理やオプションなどについても触れています。

JSONの概要

JSON(Javascript Object Notation)はデータを送受信するためのフォーマットの一種で、文字列・論理値・配列・オブジェクトなどを扱えます。

以下にJSON形式で作られたオブジェクトの例を簡単にあげておきます。boku、1、c、d、eはそれぞれオブジェクトのフィールド名を示しています。

ちなみに、エンコーディングする前のPHP側での元のオブジェクトは、こんな形です。下記のコードで使われているstdClassはPHPに元から組み込まれているクラスで、必要に応じて自動的に呼び出されます。

では、簡単にどんな物かお伝えしたので、具体的な使い方を見ていきましょう。

Json_encodeの使い方(配列)

PHPの公式ドキュメントによると、json_encodeは以下のように定義されています。

string json_encode ( mixed $value [, int $options = 0 [, int $depth = 512 ]] )

公式ドキュメントの内容だけでは、わかりにくいので具体的に解説していきます。そもそも、配列には連想配列(キーが文字列の配列)とインデックス配列(キーが数字のみの配列)があるのですが、前者の連想配列をjson_encodeする場合には注意が必要です。

なぜなら、「Jsonには連想配列がない」からです。そのため、Jsonではオブジェクトを用いて連想配列を表現しなければなりません。

ここで使われている「 { 」と「 } 」はJsonのオブジェクトの開始と終了を意味します。aがプロパティ、1がその値・・・という風に一つ一つオブジェクトを用いて定義されています。

連想配列の処理を解説したので、次はインデックス配列をjson_encodeを用いてエンコーディングします。インデックス配列は連想配列とは違い、配列のままエンコーディングが出来ます。

オブジェクトの場合は、「 { 」、「 } 」でオブジェクトを表しましたが、配列の場合は「 [ 」、「 ] 」で表します。

補足ですが、連想配列・インデックス配列をjson_encodeする際には注意点があります。それは、「Jsonではオブジェクトのキーは必ずダブルクォートで括って文字列にしなければならない」です。

PHPでオブジェクトを作る場合には、シングルクォートで括って文字列を作っても良いですが、Jsonの場合にはそれでは動作しません。したがって、

のように、文字列をシングルクォートで括ると動作しないので、ダブルクォートで括るようにしましょう。

Json_encodeの使い方(文字列)

ここからは文字列をjson_encodeしながら、オプションなどを解説していきます。

まずは、ただの英数字をエンコードしてみます。

英数字をエンコードした場合は、そのまま出力されます。次は、日本語をエンコードしてみます。

日本語をエンコードした場合には、Javascriptでエスケープするために使われるunicodeで変換された後の値が出力されます。

これを回避するには、json_encodeの引数に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してみます。このとき、ダブルクォートである「”」はそのまま出力されてしまいます。

次に、オプションを用いて、”をエスケープします。

エスケープしたことで、”がu0022に変わりました。

なお、これらの関数を利用するときは、「 | 」を用いることで複数のオプションをセットできます。次の例では、上記のコード例でエスケープしていなかった「 & 」もJSON_HEX_AMP関数を用いてエスケープします。

以上のように、JSON_HEX_QUOT、そしてJSON_HEX_AMPを用いることで「 ” 」が「u0022」にエスケープされ、「 & 」も「u0026」にエスケープされました。

まとめ

今回は、Json_encodeの使い方についてお伝えしました。

具体的には、

・JSONの概要
・json_encodeの使い方
・json_encodeのデータ変換関数

についてお伝えしました。

データを送受信する際には、jsonを使うことが多いので、この記事で是非jsonのエンコーディング方法を覚えて頂けたのでしたら幸いです。