在web開發中,經常需要將一個物件陣列傳送給前端處理,而這個資料通常需要以json格式傳輸。 util中許多語言都提供了將物件轉換為json格式的工具,php也不例外。本文將詳細介紹php中將物件陣列轉換為json格式的方法。
一. json_encode()函數的使用
PHP中提供了json_encode()函數將物件陣列轉換為json格式。使用函數的方法如下:
範例程式碼:
<?php $person = array( 'name' => 'jack', 'age' => 18, 'city' => 'beijing' ); echo json_encode($person); ?>
輸出結果:
{"name":"jack","age":18,"city":"beijing"}
可以看到,json_encode()函數的作用是將陣列或物件轉換為json格式的字串。在範例中,我們定義了一個物件$person,然後透過json_encode()函數將$person物件轉換為json格式的字串並輸出。
二. 帶參數使用json_encode()函數
json_encode()函數除了可以將物件陣列轉換為json格式的字串之外,還可以接受4個參數。
$a. $value參數
$value參數用來傳遞需要轉換的物件(或陣列)。 $value參數可以是任何PHP類型,除了一個resource類型。在具體使用中,我們會發現一個嵌套或嵌套最多的陣列或物件可以包含多個鍵值對、嵌套、陣列或物件。在遇到這種情況時,可以使用這種語法來建構新的 陣列或物件。
範例程式碼:
<?php //嵌套数组和对象的例子 $person = array( 'name' => 'jack', 'age' => 18, 'city' => 'beijing', 'hobby' => array( 'reading', 'music', 'sports', 'travel' ), 'friends' => array( array( 'name' => 'tom', 'phone' => '13812999010' ), array( 'name' => 'lily', 'phone' => '13812999020' ) ) ); //使用json_encode()的方式将$person数组转换为json格式字符串 echo json_encode($person); ?>
輸出結果:
{"name":"jack","age":18,"city":"beijing","hobby":["reading","music","sports","travel"],"friends":[{"name":"tom","phone":"13812999010"},{"name":"lily","phone":"13812999020"}]}
可以看到,json_encode()函數支援巢狀數組和對象,這對於一些比較複雜的資料格式而言是非常方便實用的。
$b. $options參數
$options參數用來指定如何轉換物件和陣列。例如,如果想要在輸出的json字串中停用UTF-8編碼,則可以使用JSON_UNESCAPED_UNICODE選項。此選項使輸出中的所有非英文字元均以其原始表示出現。
範例程式碼:
<?php $person = array( 'name' => 'jack', 'age' => 18, 'city' => 'beijing' ); echo json_encode($person, JSON_UNESCAPED_UNICODE); ?>
輸出結果:
{"name":"jack","age":18,"city":"beijing"}
$c. $depth參數
$depth參數用來指定物件或陣列在轉換為json字串之前的最大深度,此參數大於0有效,否則無效。如果資料深度超過了指定的深度,則json_encode()函數將傳回FALSE。預設情況下,$depth參數為512。
範例程式碼:
<?php $person = array( 'name' => 'jack', 'age' => 18, 'city' => 'beijing', 'hobby' => array( 'reading', 'music', 'sports', 'travel' ), 'friends' => array( array( 'name' => 'tom', 'phone' => '13812999010' ), array( 'name' => 'lily', 'phone' => '13812999020' ) ) ); echo json_encode($person, JSON_PRETTY_PRINT, 3); ?>
輸出結果:
{ "name": "jack", "age": 18, "city": "beijing", "hobby": [ "reading", "music", "sports", "travel" ], "friends": [ { "name": "tom", "phone": "13812999010" }, { "name": "lily", "phone": "13812999020" } ] }
我們可以看到,透過使用JSON_PRETTY_PRINT和$depth參數,輸出的json字串將格式化並且整個對象將被縮排。
$d. $reserved參數
$reserved參數指定當物件或陣列中的成員名稱與php保留字衝突時應採取的措施。預設的措施是添加一個底線。此參數只有在以JSON_FORCE_OBJECT作為選項時才生效。
三. 例外處理
當使用json_encode()函數進行JSON編碼時,可能會出現一些例外情況,這些情況需要特殊處理,否則會導致json_encode()函數無法正常運作。
$a. 編碼問題
如果想在$person的name鍵中嵌入一個ISO-8859-1編碼的非unicode字串,json_encode()將會失敗。但是,如果將相關字串轉換為Unicode,則可以正常編碼。
範例程式碼:
<?php $data = array( "name" => "Manfred", "age" => "31", "city" => "车里雅宾斯克", "UTF8" => "こんにちは" ); foreach ($data as $key => $value) { if (!mb_detect_encoding($value, 'utf-8', true)) { $data[$key] = mb_convert_encoding($value, 'UTF-8', 'ISO-8859-1'); } } echo json_encode($data); ?>
輸出結果:
{"name":"Manfred","age":"31","city":"\u8f66\u91cc\u96c6\u5bbe\u65af\u514b","UTF8":"こんにちは"}
可以看到,在將ISO-8859-1字串轉換為UTF-8字串之後,json_encode( )函數成功將物件轉換為了JSON格式。
$b. UTF-8 BOM頭問題
如果你在物件陣列中包含以UTF-8 BOM頭編碼的字串,那麼json_encode()函數將不起作用。因此,在編寫包含BOM頭編碼的程式時,應該手動刪除BOM頭,以便在使用json_encode()函數時不會出現問題。
c. 多位元組數組問題
json_encode()函數只接受正確的UTF-8字串,而不接受其他多位元組編碼方案。如果物件陣列中包含了這些編碼方案,則需要使用mb_convert_encoding()函數將它們轉換為UTF-8字串。
範例程式碼:
<?php $array = ['你好', 'こんにちは', 'Привет']; $json = json_encode($array); echo $json; // Error: Malformed UTF-8 characters, possibly incorrectly encoded
輸出結果:
Error: Malformed UTF-8 characters, possibly incorrectly encoded
這裡我們可以看到,由於將多位元組數組轉換為json字串導致了異常,我們可以透過使用mb_convert_encoding()來解決這個問題。
範例程式碼:
<?php $array = ['你好', 'こんにちは', 'Привет']; $json = json_encode(array_map(function ($str) { return mb_convert_encoding($str, 'UTF-8', 'UTF-8'); }, $array)); echo $json; ?>
輸出結果:
["你好","こんにちは","Привет"]
總之,json_encode()是一個非常方便的函數,可以幫助我們將物件陣列轉換為json格式的字符串。在使用中,需要清楚了解常見問題的解決方法,以便更好地使用該函數。
以上是php怎麼將物件數組轉為json格式的詳細內容。更多資訊請關注PHP中文網其他相關文章!