【PHP】json_decode:JSONから配列や連想配列に変換する方法

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)

 

以上です。



投稿日:2021-06-17    更新日:2021-06-17

[スポンサーリンク]

[スポンサーリンク]

  
関連記事
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
サイト内検索
プロフィール

プロフィール

[Name : POCO(@PocoIt2019)]
都内で社内SEをしているおじさん。
仕事で得られる知識だけでは限界を感じ、 WEBの勉強がてらITブログを開始。
サーバからWEBサイトまでフルスクラッチで開発しました。
現在は勉強のモチベーションを保つために活用中。
興味があることを雑記的に書いていきます。

[スポンサーリンク]

[スポンサーリンク]