【PHP】json_decode:JSONから配列や連想配列に変換する方法
-
カテゴリ:
- PHP
PHPでJSON形式のデータを通常の配列や連想配列に変換する方法をまとめました。
json_decode
JSONから配列への変換には「json_decode」を使用します。
json_decode関数1つで、通常配列から連想配列まで変換可能です。
json_decodeの使い方
# json_decodeの構文
json_decode(
string $json,
bool|null $associative = null,
int $depth = 512,
int $flags = 0
)
/*
引数
$json: JSONの値
$associative: trueの場合は連想配列形式を返し、falseの場合はobujectクラスを返す(デフォルト:null or false)
$depth:JSONデータのネストの深さの最大値 (デフォルト:512)
$flags:JSON_BIGINT_AS_STRING, JSON_INVALID_UTF8_IGNORE, JSON_INVALID_UTF8_SUBSTITUTE, JSON_OBJECT_AS_ARRAY, JSON_THROW_ON_ERROR. からなるビットマスク
*/
By https://www.php.net/manual/ja/function.json-decode.php
json_decodeの使用例
どのような配列のパターンにも対応しているか検証してみます。
・パターン①
まずは、シンプルな配列と連想配列での結果を見てみます。
JSONは[...]で囲むと配列と認識され、{...}で囲むと連想配列として認識されます。
<?php
$json1 = '[
"読書",
"映画鑑賞",
"旅行"
]';
$json2 = '{"名前" : "太郎"}';
var_dump( json_decode($json1 , true) );
var_dump( json_decode($json2 , true) );
結果:
array (size=3)
0 => string '読書' (length=6)
1 => string '映画鑑賞' (length=12)
2 => string '旅行' (length=6)
array (size=1)
'名前' => string '太郎' (length=6)
・パターン②
つぎに、配列の中に連想配列が入れ子になっているパターン。
<?php
$json3 = '[
{
"教科": "算数",
"点数": "100"
},
{
"教科": "英語",
"点数": "5"
}
]';
var_dump( json_decode($json3 , true) );
結果:
array (size=2)
0 =>
array (size=2)
'教科' => string '算数' (length=6)
'点数' => string '100' (length=3)
1 =>
array (size=2)
'教科' => string '英語' (length=6)
'点数' => string '5' (length=1)
・パターン③
今度は連想配列のなかに配列が入れ子になっているパターンです。
<?php
$json4 = '{
"趣味": [
"読書",
"映画鑑賞",
"旅行"
]
}';
$json5 = '{
"プロフィール": {
"名前": "太郎",
"年齢": "10",
"誕生日": "2011-06-17"
}
}';
var_dump( json_decode($json4 , true) );
var_dump( json_decode($json5 , true) );
結果:
array (size=1)
'趣味' =>
array (size=3)
0 => string '読書' (length=6)
1 => string '映画鑑賞' (length=12)
2 => string '旅行' (length=6)
array (size=1)
'プロフィール' =>
array (size=3)
'名前' => string '太郎' (length=6)
'年齢' => string '10' (length=2)
'誕生日' => string '2011-06-17' (length=10)
・パターン④
最後に、通常の配列と連想配列が入り混じっているパターンです。
<?php
$json6 = '{
"No": 1,
"プロフィール": {
"名前": "太郎",
"年齢": "10",
"誕生日": "2011-06-17"
}
}';
$json7 = '{
"No": 2,
"プロフィール": {
"名前": "花子",
"年齢": "20",
"誕生日": "2001-06-17",
"趣味": [
"読書",
"映画鑑賞",
"旅行"
]
}
}';
var_dump( json_decode($json6 , true) );
var_dump( json_decode($json7 , true) );
結果:
array (size=2)
'No' => int 1
'プロフィール' =>
array (size=3)
'名前' => string '太郎' (length=6)
'年齢' => string '10' (length=2)
'誕生日' => string '2011-06-17' (length=10)
array (size=2)
'No' => int 2
'プロフィール' =>
array (size=4)
'名前' => string '花子' (length=6)
'年齢' => string '20' (length=2)
'誕生日' => string '2001-06-17' (length=10)
'趣味' =>
array (size=3)
0 => string '読書' (length=6)
1 => string '映画鑑賞' (length=12)
2 => string '旅行' (length=6)
どの形式のJSONも、json_decode関数で問題なく配列に変換できそうです。
戻り値をオブジェクトクラスにする
第2引数がtrueの場合は配列の形式で値を返しますが、falseの場合はobjectクラスを返します。
<?php
$json = '{
"No": 2,
"プロフィール": {
"名前": "花子",
"年齢": "20",
"誕生日": "2001-06-17",
"趣味": [
"読書",
"映画鑑賞",
"旅行"
]
}
}';
$list = json_decode($json , true);
var_dump($list);
$object = json_decode($json , false);
var_dump($object);
結果:
array (size=2)
'No' => int 2
'プロフィール' =>
array (size=4)
'名前' => string '花子' (length=6)
'年齢' => string '20' (length=2)
'誕生日' => string '2001-06-17' (length=10)
'趣味' =>
array (size=3)
0 => string '読書' (length=6)
1 => string '映画鑑賞' (length=12)
2 => string '旅行' (length=6)
object(stdClass)[1]
public 'No' => int 2
public 'プロフィール' =>
object(stdClass)[2]
public '名前' => string '花子' (length=6)
public '年齢' => string '20' (length=2)
public '誕生日' => string '2001-06-17' (length=10)
public '趣味' =>
array (size=3)
0 => string '読書' (length=6)
1 => string '映画鑑賞' (length=12)
2 => string '旅行' (length=6)
json_decodeの注意点
JSON以外の値をでコードしてみる
引数に渡す値をJSON以外のデータにした場合、どうなるのか検証しました。
<?php
#JSON形式以外の値
var_dump( json_decode(10 , true) );
# ⇒ 結果:10 (int型)
var_dump( json_decode("10" , true) );
# ⇒ 結果:10 (int型)
var_dump( json_decode("TEST1" , true) );
# ⇒ 結果:null
var_dump( json_decode(FALSE , true) );
# ⇒ 結果:null
var_dump( json_decode("" , true) );
# ⇒ 結果:null
var_dump( json_decode(null , true) );
# ⇒ 結果:null
数値や数値文字はそのままint型の数値で返ってきます。
しかし、文字列やboolean型の値、空文字やNULLなどを渡した場合はエラーとなり、「NULL」が返ってくる仕様のようです。
ネストの指定間違い
第3引数に配列のネストの深さの最大値を指定することができますが、指定した深さ以上のJSONをでコードするとエラーになりNULLが帰ってきます。
・深さが適正の場合
<?php
$json = '{
"階層1": {
"階層2": "年齢3"
}
}';
var_dump( json_decode($json , true, 3) );
var_dump( json_decode($json , true, 4) );
結果:
array (size=1)
'階層1' =>
array (size=1)
'階層2' => string '年齢3' (length=7)
array (size=1)
'階層1' =>
array (size=1)
'階層2' => string '年齢3' (length=7)
・深さが不適正の場合
<?php
$json = '{
"階層1": {
"階層2": {
"年齢3": "階層4"
}
}
}';
var_dump( json_decode($json , true, 3) ); #←エラー:4階層あるデータを深さの最大値3で指定
var_dump( json_decode($json , true, 4) );
結果:
null
array (size=1)
'階層1' =>
array (size=1)
'階層2' =>
array (size=1)
'年齢3' => string '階層4' (length=7)
以上です。