JSON

JSONのノート1

More than 3 years have passed since last update.


参照

https://syncer.jp/how-to-use-json


基礎知識


  • JSONとはデータフォーマットの一種。

  • JSONを使用すると、文字列、数値、論理値、配列、オブジェクト(キーと値の集まり)などのデータをコンピュータ間で送受信することができる。

  • JSON形式で表現されたオブジェクトの例を次に示します。
    (id、name、age、telはオブジェクトのフィールド名を表します)

  • JSONのデータはUnicodeでエンコードされます。デフォルトのエンコーディングはUTF-8です。

  • 整数や浮動小数点は、JSONでも同一の表現となる。

  • 定数true、false、nullは、PHPでは大文字と小文字を区別しないが、JSONでは小文字のキーワードで表現される。


  • JSONはオブジェクト形式と配列形式の2種類を意識する。「オブジェクト」と「配列」。オブジェクトは{...}で囲み、配列は[...]で囲みます。



JSONにおけるオブジェクトと配列の表現


  • stdClassは、PHPの組み込みクラス。

  • stdClassには事前に定義されたフィールドやメソッドではなく、必要に応じてフィールドを追加して使用する。

{"id":123,"name":"Taro","age":22,"tel":"090-9999-9999"}


  • キーは、文字列

  • 連想配列のJSON キーは文字列にならない


json_encode


  • json_encode()を使用して、ユーザーが定義したクラスのインスタンスをエンコードすることができる。


  • エンコードされたJSON形式の文字列の中には、元のインスタンスのクラス名やメソッドに関する情報は含まれずフィールド名とその値だけが出力される。


  • フィールドのアクセス修飾子がprotectedまたはprivateである場合は、

    json_encode()はそのフィールドの情報を出力に含めない。

    protectedフィールドやprivateフィールドにアクセスできる

    クラスの内部からjson_encode()を呼び出した場合も同様の動作。


  • json_encode()の第2引数には、JSON_HEX_QUOTやJSON_HEX_TAGなどのオプションを指定することが可能。

    複数のオプションを同時に指定するには「|」演算子を使用して、「JSON_HEX_QUOT | JSON_HEX_TAG」のように記述する。


<?php

$arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
echo json_encode($arr);
?>

<出力>

{"a":1,"b":2,"c":3,"d":4,"e":5}


json_decode


  • json_decode()を使用して、オブジェクトを表すJSONの { }で囲まれた文字列を
    デコードすると、PHPの組み込みのクラスであるstdClassのインスタンスが生成される。

<?php

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

var_dump(json_decode($json));
var_dump(json_decode($json, true));
?>

<出力>

object(stdClass)#1 (5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}

array(5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}


json_last_error()


  • json_encode()やjson_decode()は、処理中にエラーが発生したとき、エラーを出力したり、例外を送出したりすることはない。


  • json_last_error()を使用して取得することができる。


http://php.net/manual/ja/function.json-last-error.php


jsonの使用例

<!DOCTYPE html>

<html lang="ja">
<head>
<meta charset="utf-8">
</head>
<body>
<input type="text" name="name" id="name">
<input type="button" id="greet" value="Greet!">
<div id="result"></div>

<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script>
$(function() {
$('#greet').click(function() {
$.get('greet.php', {
name: $('#name').val()
}, function(data) {
$('#result').html(data.message + '(' + data.length + ')');
console.log( data );
       var data = JSON.stringify(data);
       console.log( data );
});
});
});
</script>
</body>
</html>

前者が、サーバーから受け取ったデータ、後者がJSON.stringifyでJSONに変換したデータ

スクリーンショット 2015-11-19 16.41.23.png

<?php

$response = array(
"message" => htmlspecialchars("hi! " . $_GET['name'], ENT_QUOTES, "utf-8"),
"length" => strlen($_GET['name'])
);
header('Content-Type: application/json; charset=utf-8');
echo json_encode($response);


JSだけでJSONを使う(Local Storage)

<!DOCTYPE html>

<html lang="ja">
<head>
<meta charset="utf-8">
<title>Web Storage</title>
</head>
<body>
<script>
(function() {
if (typeof(Storage) === "undefined") {
alert("Web Storage Not Supported");
} else {
// localStorage:同じページを複数のタブで開いていてもデータが共有される
var s = localStorage;
var user = {
name: 'taguchi',
score: 80
};
//保存 s.setItem(key,value);
//取得 s.getItem(key);
//文字列をJSONにする
s.setItem('user', JSON.stringify(user));
//元に戻す
console.log(s.getItem('user'));
console.log(JSON.parse(s.getItem('user')));
}
})();
</script>
</body>
</html>

スクリーンショット 2015-11-19 15.42.12.png

前者がJSON、後者がパース

111.png


JSONにアクセスする

{

"japan": [
{
"tokyo": [
"渋谷",
{
"city": "歌舞伎町"
},
"足立区"
]
}
]
}

// 配列型

$array = json_decode( $json , true ) ;
$array["japan"][0]["tokyo"][0] ; // 渋谷
$array["japan"][0]["tokyo"][1]["city"] ;// 歌舞伎町
$array["japan"][0]["tokyo"][2] ; // 足立区

// オブジェクト型
$obj = json_decode( $json ) ;
$obj->japan[0]->tokyo[0] ; // 渋谷
$obj->japan[0]->tokyo[1]->city ;// 歌舞伎町
$obj->japan[0]->tokyo[2] ; // 足立区