PHPでJSONの処理

#はじめに
こんにちは。某学校でプログラミング等の勉強中のサーバーサイドのプログラマーのワタタクです。:relaxed:
今回は私のプログラマー人生の元祖「PHP」のことでございます。

今回は題名にもありますがJSONの処理についてまとめて見ました。
#そもそもJSONって？
知っているかも知れませんが一葉念のために記述しておくと、*JavaScript Object Notation*の略で、JavaScriptの処理の中でオブジェクトを記述するためのデータ形式のことです。

XMLのように簡潔に構造化されたデータを記述することが可能で、最も理解しやすいフォーマットと言えます。

JSON形式は「キーと値」のペアで成り立っており、さまざまなプログラミング言語に対応しているため、1つのJSON形式のデータを用意しておけば他の言語と共通して使用することが可能です。
#json_encodeとは
指定した値をJSON形式に変換するには、json_encode関数を使用します。

```
json_encode関数は以下のように記述します。

書き方： 
string json_encode( $値 [, JSON定数 [, 深さ = 512 ]] )

引数： 
第一引数にはJSON形式に変換するための文字列や配列を指定します。
第二引数を指定した場合は、どのような形式で変換するか、オプションで定数を指定することができます。

返り値：
json_encode関数は、戻り値にJSONエンコードされた値を返し、処理が失敗した場合はFALSEを返します。
```
*注*
``変換する全ての文字列データは文字コードUTR-8にエンコードされていなければいけません。``
#json_encodeの使い方

```php
//配列を作成
$fruits_array = ['apple'=>'fruits1',
                 'orange'=>'fruits2',
                 'melon'=>'fruits3',
                 'pineapple'=>'fruits4'
                ];
 
//配列をJSON形式に変換
$jsonstr =  json_encode($fruits_array);
 
echo $jsonstr;
```

```
{"apple":"fruits1","orange":"fruits2","melon":"fruits3","pineapple":"fruits4"}
```
``＊第二引数にJSON_UNESCAPED_UNICODEを指定すると日本語が扱える``
#json_decodeとは
JSON形式にエンコードされた文字列を受け取って、デコードするには**json_decode**関数を使用します。

デコードとは、簡単に説明するとエンコードされたデータを元に戻すことを言います。

```
json_decode関数は、以下のように記述します。

書き方：
json_decode ( string $JSON文字列 [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] )

引数：
第一引数にはデコード対象のJSON文字列を指定します、以降の引数は各種オプションを指定します。

assoc：TRUEの場合は連想配列の形式で返されます。
depth：ユーザー指定の再帰の深さを指定します。
options：JSONデコードオプションのビットマスクを指定します。

返り値：
JSONエンコードされたデータを、適切なPHPの型として返します。

デコードを失敗したり、再起制限を超えている場合はNULLを返します。

```
#json_decodeの使い方

```php
//配列を作成
$fruits_array = ['apple'=>'fruits1',
                 'orange'=>'fruits2',
                 'melon'=>'fruits3',
                 'pineapple'=>'fruits4'
                ];
 
//配列をJSON形式に変換
$jsonstr =  json_encode($fruits_array);
 
//JSON形式を元に戻す
$fruits = json_decode($jsonstr, true);
 
print_r($fruits);
```
```
Array
(
    [apple] => fruits1
    [orange] => fruits2
    [melon] => fruits3
    [pineapple] => fruits4
)
```
#TIPS
*Content-Type:application/json*で送信されると、key=valueが無いので当然ながら、$_POST変数が空っぽになります。
そこで、HTTPリクエスト本文に **php://input** の fopen wrapperを使って直接ストリームにアクセスを試みます。

```php
<?php
$json_string = file_get_contents('php://input'); //今回のキモ

echo $json_string;
$obj = json_decode($json_string);
var_dump($obj);
```

#追記 2018-11-22
##サンプルコード
Android端末などのスマートフォンなどから送信(POST)されたデータ(名前、コメント)をデータベースに保存し、レスポンスとして、登録完了メッセージと登録日時を返してあげる

```php
<?php
$dsn="mysql:dbname=db_name;host=host_name;charset=utf8";
$user="unknown";
$pass="******";


$name = $_POST["name"];
$coment = $_POST["coment"];

$created = date('Y-m-d H:i:s');

$status = true;

$msg = "";
if(strlen($name) == 0) {
    $msg += "名前が未入力です\n";
    
}

if(strlen($coment) == 0) {
    $msg += "コメントが未入力です\n";
}

try{
    $pdo=new PDO($dsn,$user,$pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
    $sql = "insert into table_name (name, coment, created) value (:name, :coment, ;created)";
    $stmt=$pdo->prepare($sqlInsert);
    $result=$stmt->execute(array(
                             ":name" => $name,
                             ":coment" => $coment,
                             ":created" => $created
                           ));
    $msg += "登録完了";     

}catch(PDOException $e){
    $msg += "登録失敗";
    $status = false;
} finally {
   $pdo = null;
}

$returnArray["created"] = $created;
$returnArray["msg"] = $msg;
$returnArray["status"] = $status;


$json = json_encode($returnArray);
header("Content-Type: application/json; charset=utf-8”);
print($json);

```
#まとめ
*要するに大事なことは、配列returnArrayに値を突っ込んで、json_encodeするだけ!!*

#さいごに
jsonの扱いも簡単ですねw

もし何か間違っている等のご指摘があればご連絡ください。
最後まで読んで頂きありがとうございました。