PHP JSON 教學範例
JSON 為目前網路資料傳輸領域最常使用的「資料交換格式」,也是伺服語言(PHP)與 JavaScript 使用 AJAX 作為資料交換的主要方式。本篇文章將以範例說明如何使用 PHP 處理 JSON。
如對 JSON 不了解,建議先閱讀 JSON 格式與 JavaScript 解析教學範例
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 |
所有的 & 轉換成 \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] => 撰寫文章
)
)
*/
參考
本著作係採用創用 CC 姓名標示-相同方式分享 3.0 台灣 授權條款授權.
請問可以轉載嗎?會註明原網址
可以的,謝謝~
文章寫的真好。
就是能不能加上我的JSON在線網站,好難呀 https://www.jsonformatting.com/
=口=
謝謝~
但看不太懂您的意思。