從5.2版本開始,PHP原生提供json_encode()和json_decode()函數,前者用于編碼,後者用于解碼。
一、json_encode()
<code><?php</code>
<code>$arr</code> <code>= </code><code>array</code> <code>(</code><code>'a'</code><code>=>1,</code><code>'b'</code><code>=>2,</code><code>'c'</code><code>=>3,</code><code>'d'</code><code>=>4,</code><code>'e'</code><code>=>5);</code>
<code>echo</code> <code>json_encode(</code><code>$arr</code><code>);</code>
<code>?></code>
輸出
<code>{</code><code>"a"</code><code>:1,</code><code>"b"</code><code>:2,</code><code>"c"</code><code>:3,</code><code>"d"</code><code>:4,</code><code>"e"</code><code>:5}</code>
再看一個對象轉換的例子:
<code>$obj</code><code>->body = </code><code>'another post'</code><code>;</code>
<code>$obj</code><code>->id = 21;</code>
<code>$obj</code><code>->approved = true;</code>
<code>$obj</code><code>->favorite_count = 1;</code>
<code>$obj</code><code>->status = NULL;</code>
<code>echo</code> <code>json_encode(</code><code>$obj</code><code>);</code>
輸出
<code>{</code>
<code> </code><code>"body"</code><code>:</code><code>"another post"</code><code>,</code>
<code> </code>
<code> </code><code>"id"</code><code>:21,</code>
<code> </code><code>"approved"</code><code>:true,</code>
<code> </code><code>"favorite_count"</code><code>:1,</code>
<code> </code><code>"status"</code><code>:null</code>
<code> }</code>
由于json隻接受utf-8編碼的字元,是以json_encode()的參數必須是utf-8編碼,否則會得到空字元或者null。當中文使用GB2312編碼,或者外文使用ISO-8859-1編碼的時候,這一點要特别注意。
二、索引數組和關聯數組
PHP支援兩種數組,一種是隻儲存"值"(value)的索引數組(indexed array),另一種是儲存"名值對"(name/value)的關聯數組(associative array)。
由于javascript不支援關聯數組,是以json_encode()隻将索引數組(indexed array)轉為數組格式,而将關聯數組(associative array)轉為對象格式。
比如,現在有一個索引數組
<code>$arr</code> <code>= Array(</code><code>'one'</code><code>, </code><code>'two'</code><code>, </code><code>'three'</code><code>);</code>
<code>[</code><code>"one"</code><code>,</code><code>"two"</code><code>,</code><code>"three"</code><code>]</code>
如果将它改為關聯數組:
<code>$arr</code> <code>= Array(</code><code>'1'</code><code>=></code><code>'one'</code><code>, </code><code>'2'</code><code>=></code><code>'two'</code><code>, </code><code>'3'</code><code>=></code><code>'three'</code><code>);</code>
輸出變為
<code>{</code><code>"1"</code><code>:</code><code>"one"</code><code>,</code><code>"2"</code><code>:</code><code>"two"</code><code>,</code><code>"3"</code><code>:</code><code>"three"</code><code>}</code>
注意,資料格式從"[]"(數組)變成了"{}"(對象)。
如果你需要将"索引數組"強制轉化成"對象",可以這樣寫
<code>json_encode( (object)</code><code>$arr</code> <code>);</code>
或者
<code>json_encode ( </code><code>$arr</code><code>, JSON_FORCE_OBJECT );</code>
三、類(class)的轉換
下面是一個PHP的類:
<code>class</code> <code>Foo {</code>
<code> </code><code>const</code> <code>ERROR_CODE = </code><code>'404'</code><code>;</code>
<code> </code><code>public</code> <code>$public_ex</code> <code>= </code><code>'this is public'</code><code>;</code>
<code> </code><code>private</code> <code>$private_ex</code> <code>= </code><code>'this is private!'</code><code>;</code>
<code> </code><code>protected</code> <code>$protected_ex</code> <code>= </code><code>'this should be protected'</code><code>;</code>
<code> </code><code>public</code> <code>function</code> <code>getErrorCode() {</code>
<code> </code><code>return</code> <code>self::ERROR_CODE;</code>
<code> }</code>
<code>}</code>
現在,對這個類的執行個體進行json轉換:
<code>$foo</code> <code>= </code><code>new</code> <code>Foo;</code>
<code>$foo_json</code> <code>= json_encode(</code><code>$foo</code><code>);</code>
<code>echo</code> <code>$foo_json</code><code>;</code>
輸出結果是
<code>{</code><code>"public_ex"</code><code>:</code><code>"this is public"</code><code>}</code>
可以看到,除了公開變量(public),其他東西(常量、私有變量、方法等等)都遺失了。
四、json_decode()
該函數用于将json文本轉換為相應的PHP資料結構。下面是一個例子:
<code>$json</code> <code>= </code><code>'{"foo": 12345}'</code><code>;</code>
<code>$obj</code> <code>= json_decode(</code><code>$json</code><code>);</code>
<code>print</code> <code>$obj</code><code>->{</code><code>'foo'</code><code>}; </code><code>// 12345</code>
通常情況下,json_decode()總是傳回一個PHP對象,而不是數組。比如:
<code>$json</code> <code>= </code><code>'{"a":1,"b":2,"c":3,"d":4,"e":5}'</code><code>;</code>
<code>var_dump(json_decode(</code><code>$json</code><code>));</code>
結果就是生成一個PHP對象:
<code>object(stdClass)#1 (5) {</code>
<code> [</code><code>"a"</code><code>] => int(1)</code>
<code> [</code><code>"b"</code><code>] => int(2)</code>
<code> [</code><code>"c"</code><code>] => int(3)</code>
<code> [</code><code>"d"</code><code>] => int(4)</code>
<code> [</code><code>"e"</code><code>] => int(5)</code>
如果想要強制生成PHP關聯數組,json_decode()需要加一個參數true:
<code> </code>
<code> var_dump(json_decode(</code><code>$json</code><code>,true));</code>
結果就生成了一個關聯數組:
<code>array</code><code>(5) {</code>
<code> </code><code> [</code><code>"a"</code><code>] => int(1)</code>
<code> </code><code> [</code><code>"b"</code><code>] => int(2)</code>
<code> </code><code> [</code><code>"c"</code><code>] => int(3)</code>
<code> </code><code> [</code><code>"d"</code><code>] => int(4)</code>
<code> </code><code> [</code><code>"e"</code><code>] => int(5)</code>
五、json_decode()的常見錯誤
下面三種json寫法都是錯的,你能看出錯在哪裡嗎?
<code>$bad_json</code> <code>= </code><code>"{ 'bar': 'baz' }"</code><code>;</code>
<code>$bad_json</code> <code>= </code><code>'{ bar: "baz" }'</code><code>;</code>
<code>$bad_json</code> <code>= </code><code>'{ "bar": "baz", }'</code><code>;</code>
對這三個字元串執行json_decode()都将傳回null,并且報錯。
第一個的錯誤是,json的分隔符(delimiter)隻允許使用雙引号,不能使用單引号。第二個的錯誤是,json名值對的"名"(冒号左邊的部分),任何情況下都必須使用雙引号。第三個的錯誤是,最後一個值之後不能添加逗号(trailing comma)。
另外,json隻能用來表示對象(object)和數組(array),如果對一個字元串或數值使用json_decode(),将會傳回null。
<code>var_dump(json_decode(</code><code>"Hello World"</code><code>)); </code><code>//null</code>
如何聯系我:【萬裡虎】www.bravetiger.cn
【QQ】3396726884 (咨詢問題100元起,幫助解決問題500元起)
【部落格】http://www.cnblogs.com/kenshinobiy/