LoginSignup
7
15

More than 3 years have passed since last update.

PHPでJSONの処理

Last updated at Posted at 2018-11-19

はじめに

こんにちは。某学校でプログラミング等の勉強中のサーバーサイドのプログラマーのワタタクです。: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の使い方

//配列を作成
$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

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

7
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
15