天天看點

***在PHP語言中使用JSON和将json還原成數組(json_decode()的常見錯誤)

從5.2版本開始,PHP原生提供json_encode()和json_decode()函數,前者用于編碼,後者用于解碼。

一、json_encode()

<code>&lt;?php</code>

<code>$arr</code> <code>= </code><code>array</code> <code>(</code><code>'a'</code><code>=&gt;1,</code><code>'b'</code><code>=&gt;2,</code><code>'c'</code><code>=&gt;3,</code><code>'d'</code><code>=&gt;4,</code><code>'e'</code><code>=&gt;5);</code>

<code>echo</code> <code>json_encode(</code><code>$arr</code><code>);</code>

<code>?&gt;</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>-&gt;body           = </code><code>'another post'</code><code>;</code>

<code>$obj</code><code>-&gt;id             = 21;</code>

<code>$obj</code><code>-&gt;approved       = true;</code>

<code>$obj</code><code>-&gt;favorite_count = 1;</code>

<code>$obj</code><code>-&gt;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>=&gt;</code><code>'one'</code><code>, </code><code>'2'</code><code>=&gt;</code><code>'two'</code><code>, </code><code>'3'</code><code>=&gt;</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>-&gt;{</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>] =&gt; int(1)</code>

<code>  [</code><code>"b"</code><code>] =&gt; int(2)</code>

<code>  [</code><code>"c"</code><code>] =&gt; int(3)</code>

<code>  [</code><code>"d"</code><code>] =&gt; int(4)</code>

<code>  [</code><code>"e"</code><code>] =&gt; 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>] =&gt; int(1)</code>

<code> </code><code>  [</code><code>"b"</code><code>] =&gt; int(2)</code>

<code> </code><code>  [</code><code>"c"</code><code>] =&gt; int(3)</code>

<code> </code><code>  [</code><code>"d"</code><code>] =&gt; int(4)</code>

<code> </code><code>  [</code><code>"e"</code><code>] =&gt; 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/