PHP JSON 教學

JSON 為目前網路資料傳輸領域最常使用的「資料交換格式」,也是伺服語言(PHP)與 JavaScript 使用 Ajax 技術作為資料交換的主要方式。本篇文章將以範例說明如何使用 PHP 處理 JSON 教學。

php

如對 JSON 不了解,建議先閱讀 JSON 教學、格式

json_encode()

語法說明

描述

使用該函式將 PHP 陣列(Array)和物件(Object),編碼成 JSON 字串。

語法

string json_encode ( mixed $value [, int $options = 0 ] )

參數

value 侍編碼的值,除了 resource 類型外,可以為任何資料類型(須為 UTF-8)
options JSON_HEX_TAG 所有的 < 和 > 轉換成 \u003C 和 \u003E
JSON_HEX_AMP 所有的 &s 轉換成 \u0026
JSON_HEX_APOS 所有的 ‘ 轉換成 \u0027
JSON_HEX_QUOT 所有的 " 轉換成 \u0022
JSON_FORCE_OBJECT 編碼的值不是「關聯式陣列」時,輸出一個 JSON 物件,而不是陣列
JSON_NUMERIC_CHECK 將所有數值字串編碼成 JSON 數值(將可表示為數值的字串自動轉換成數值)
JSON_BIGINT_AS_STRING 將大數值編碼成原始字符原來的值
JSON_PRETTY_PRINT 用空白字符格式化返回的資料
JSON_UNESCAPED_SLASHES 不要編碼 /
JSON_UNESCAPED_UNICODE 以字面編碼多字節 Unicode 字符(預設是編碼成 \uXXXX)

返回值

編碼成功返回一個以 JSON 格式表示的字串,或者在失敗時返回 false

PHP 陣列編碼成 JSON

PHP 支持兩種陣列

  • 索引陣列(Indexed Array):只保存值(Value),使用數值(Number)索引參考
  • 關連式陣列(Associative Array):保存「鍵 / 值對」(Key / Value),使用字串(String)索引參考

「索引陣列」編碼成 JSON

json_encode() 函式會將 PHP 索引陣列編碼成 JSON 的陣列格式。

<?php
$arr = array('網頁設計', '撰寫文章');

echo json_encode($arr);

/** 輸出:

["\u7db2\u9801\u8a2d\u8a08","\u64b0\u5beb\u6587\u7ae0"]
 */

「關連式陣列」編碼成 JSON

json_encode() 函式會將 PHP 關連式陣列編碼成 JSON 的物件格式。

因為 JavaScript 陣列的 Key 必須是數值,所以才會編碼成物件
<?php
$arr = array('number' => '1020501', 'name' => '小傑', 'age' => 32, 'sex' => "M");

echo json_encode($arr);

/** 輸出:

{"number":"1020501","name":"\u5c0f\u5091","age":32,"sex":"M"}
 */

PHP 物件編碼成 JSON

<?php
class Obj {
    public $number = '1020501';
    public $name = '小傑';
    public $age = 32;
    public $interest = array('網頁設計', '撰寫文章');
}
$obj = new Obj();

echo json_encode($obj);

/** 輸出:

{"number":"1020501","name":"\u5c0f\u5091","age":32,"interest":["\u7db2\u9801\u8a2d\u8a08","\u64b0\u5beb\u6587\u7ae0"]}
 */

指定 json_encode() 編碼格式

PHP 會自動轉換型別,所以有些數值(Number)型態資料可能會被存成字串(例如使用 PDO 從資料庫取得的資料),如果希望將數值字串編碼成 JSON 數值,可指定參數 JSON_NUMERIC_CHECK

<?php
$arr = array('number' => '1020501', 'name' => '小傑', 'age' => 32, 'sex' => "M");

echo json_encode($arr) . '<br>';

/** 輸出:

{"number":"1020501","name":"\u5c0f\u5091","age":32,"sex":"M"}
 */

// 原字串型態 '1020501' 會編碼成數值型態的 1020501 
echo json_encode($arr, JSON_NUMERIC_CHECK);

/** 輸出:

{"number":1020501,"name":"\u5c0f\u5091","age":32,"sex":"M"}
 */

另外 PHP 索引陣列預設會被編碼成 JSON 的陣列格式,如要強制編碼成物件時,可指定參數 JSON_FORCE_OBJECT

JSON 物件名稱則以 “0″, “1″…… 表示
<?php
$arr = array('網頁設計', '撰寫文章');

echo json_encode($arr) . '<br>';

/** 輸出:

["\u7db2\u9801\u8a2d\u8a08","\u64b0\u5beb\u6587\u7ae0"]
 */

// 將 PHP 索引陣列強制編碼成 JSON 的物件格式
echo json_encode($arr, JSON_FORCE_OBJECT);

/** 輸出:

{"0":"\u7db2\u9801\u8a2d\u8a08","1":"\u64b0\u5beb\u6587\u7ae0"}
 */

json_decode()

語法說明

描述

使用該函式將 JSON 格式的字串進行解碼,轉換為 PHP 變數。

語法

mixed json_decode ( string $json [, bool $assoc = false [, int $depth = 512]] )

參數

json 待解碼的 JSON 字串格式
assoc 參數為 true 時,將解碼後的 PHP 物件轉換為關連式陣列(預設值 false,不轉換)
depth 允許遞迴的最大深度(預設;最多 512)

返回值

返回 JSON 字串在相應 PHP 類型的值

JSON 轉換為 PHP 物件

<?php
$json = '{
    "number": "1020501",
    "name": "小傑",
    "age": 32,
    "sex": "M",
    "interest": [
        "網頁設計",
        "撰寫文章"
    ]
}';

$obj = json_decode($json);

echo '<pre>';
	print_r($obj);
echo '</pre>';

/** 輸出:

stdClass Object
(
    [number] => 1020501
    [name] => 小傑
    [age] => 32
    [sex] => M
    [interest] => Array
        (
            [0] => 網頁設計
            [1] => 撰寫文章
        )

)
 */

JSON 轉換為 PHP 關連式陣列

<?php
$json = '{
    "number": "1020501",
    "name": "小傑",
    "age": 32,
    "sex": "M",
    "interest": [
        "網頁設計",
        "撰寫文章"
    ]
}';

$obj = json_decode($json, true);

echo '<pre>';
	print_r($obj);
echo '</pre>';

/** 輸出:

Array
(
    [number] => 1020501
    [name] => 小傑
    [age] => 32
    [sex] => M
    [interest] => Array
        (
            [0] => 網頁設計
            [1] => 撰寫文章
        )

)
 */

發表迴響