はじめに
こんにちは。某学校でプログラミング等の勉強中のサーバーサイドのプログラマーのワタタクです。
今回は私のプログラマー人生の元祖「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の使い方
//配列を作成
$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の使い方
//配列を作成
$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
$json_string = file_get_contents('php://input'); //今回のキモ
echo $json_string;
$obj = json_decode($json_string);
var_dump($obj);
追記 2018-11-22
サンプルコード
Android端末などのスマートフォンなどから送信(POST)されたデータ(名前、コメント)をデータベースに保存し、レスポンスとして、登録完了メッセージと登録日時を返してあげる
<?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
もし何か間違っている等のご指摘があればご連絡ください。
最後まで読んで頂きありがとうございました。