php生成和解析json數據主要通過json_encode()和json_decode()函數實現。一、生成json數據使用json_encode(),常用參數包括json_unescaped_unicode防止中文轉義,json_pretty_print格式化輸出;對象需實現jsonserializable接口才能保留結構。二、解析json數據有三種方式:1. 使用json_decode($json, true)轉為關聯數組;2. 不傳第二個參數或設為false轉為stdclass對象;3. 處理嵌套結構時需正確訪問層級元素。三、常見問題處理:1. json_encode失敗可能因非utf-8字符或不可序列化類型,可用json_last_error()排查;2. json_decode失敗返回NULL,常見原因包括格式錯誤或非字符串輸入,建議用在線工具驗證json格式并檢查輸入類型。掌握這兩類函數的使用,可應對php中大部分json處理需求。
生成 JSON 數據和解析 JSON 數據在 PHP 中是非常常見的操作,尤其是前后端分離開發或者 API 接口開發中。PHP 提供了內置函數來處理 JSON 格式的數據,使用起來非常方便。
一、如何用 PHP 生成 JSON 數據?
PHP 使用 json_encode() 函數將數組或對象轉換為 JSON 格式的字符串。
$data = [ 'name' => '張三', 'age' => 25, 'is_student' => false, ]; echo json_encode($data, JSON_UNESCAPED_UNICODE);
上面的代碼會輸出:
立即學習“PHP免費學習筆記(深入)”;
{"name":"張三","age":25,"is_student":false}
- JSON_UNESCAPED_UNICODE 是常用選項,防止中文被轉義成 Unicode。
- 如果你希望格式化輸出(比如調試時),可以加上 JSON_PRETTY_PRINT。
需要注意的是,如果傳入的是對象,默認會轉換成關聯數組形式。如果你需要保留對象結構,可能需要自己實現 JsonSerializable 接口。
二、PHP 解析 JSON 數據的幾種方式
解析 JSON 主要使用 json_decode() 函數,它可以把 JSON 字符串轉換成 PHP 的數組或對象。
1. 轉換成關聯數組
默認情況下,json_decode() 返回的是對象。如果你想返回數組,第二個參數設為 true 即可:
$json_str = '{"name":"李四","age":30}'; $array = json_decode($json_str, true); print_r($array); // 輸出:Array ( [name] => 李四 [age] => 30 )
2. 轉換成對象
如果不加第二個參數,或者設為 false,就會返回一個 stdClass 對象:
$obj = json_decode($json_str); echo $obj->name; // 輸出:李四
3. 處理深層嵌套結構
當 JSON 結構比較復雜時,例如嵌套數組或對象,也要注意訪問方式是否正確。比如下面這個例子:
$json_str = '[{"id":1,"tags":["a","b"]},{"id":2,"tags":["c"]}]'; $data = json_decode($json_str, true); foreach ($data as $item) { echo "ID: {$item['id']}, Tags: " . implode(',', $item['tags']) . "n"; }
輸出:
ID: 1, Tags: a,b ID: 2, Tags: c
這里可以看到,只要結構清晰,遍歷和訪問都很直觀。
三、常見問題和注意事項
1. JSON 編碼失敗怎么辦?
有時候 json_encode() 會返回 false,這說明編碼失敗。常見原因包括:
解決方法:
- 確保數據是 UTF-8 編碼。
- 可以使用 json_last_error() 查看錯誤信息。
if (json_last_error() !== JSON_ERROR_NONE) { echo json_last_error_msg(); }
2. JSON 解析失敗怎么排查?
如果 json_decode() 返回 null,說明解析失敗。可能是:
- JSON 字符串格式不正確(比如引號沒閉合、逗號多余等)。
- 輸入不是字符串。
建議:
基本上就這些。PHP 處理 JSON 很簡單,但細節上要注意數據格式和類型,否則容易出錯。掌握好 json_encode 和 json_decode 的使用,就能應對大多數場景了。