在PHP 5.4 之前,當json_decode遇到非常大的整數時,它會將其轉換為浮動類型,這可能導致數據丟失。舉個例子,假如JSON 中有一個很大的數字:
<span><span><span class="hljs-punctuation">{</span></span><span>
</span><span><span class="hljs-attr">"big_number"</span></span><span><span class="hljs-punctuation">:</span></span><span> </span><span><span class="hljs-number">12345678901234567890</span></span><span>
</span><span><span class="hljs-punctuation">}</span></span><span>
</span></span>
在PHP 5.3 或更早版本中,調用json_decode時這個數字可能會變成浮動類型,精度會丟失。而PHP 5.4 引入了JSON_BIGINT_AS_STRING常量,當你指定此常量時, json_decode會將大整數作為字符串處理,而不是轉換為浮動類型。這樣就避免了精度丟失的問題。
例如:
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"big_number": 12345678901234567890}'</span></span><span>;
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">json_decode</span></span><span>(</span><span><span class="hljs-variable">$json</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>, </span><span><span class="hljs-number">512</span></span><span>, JSON_BIGINT_AS_STRING);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$data</span></span><span>[</span><span><span class="hljs-string">'big_number'</span></span><span>]; </span><span><span class="hljs-comment">// 輸出 "12345678901234567890"</span></span><span>
</span></span>
這種方式尤其適合需要處理金融、科學計算等領域的應用,它可以確保數值的精度不受影響。
雖然JSON_PRETTY_PRINT常量早在PHP 5.3 中就已經存在,但其對json_decode函數的行為發生了變化。在PHP 5.4 中, JSON_PRETTY_PRINT主要影響的是json_encode函數的輸出格式,而不再影響json_decode 。不過,了解這個常量的作用仍然是很重要的,因為它能幫助開發者在調試時更容易閱讀和理解JSON 數據的結構。
舉個例子, json_encode與JSON_PRETTY_PRINT常量結合使用:
<span><span><span class="hljs-variable">$array</span></span><span> = </span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-string">'foo'</span></span><span> => </span><span><span class="hljs-string">'bar'</span></span><span>, </span><span><span class="hljs-string">'baz'</span></span><span> => </span><span><span class="hljs-string">'qux'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">json_encode</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>, JSON_PRETTY_PRINT);
</span></span>
輸出結果:
<span><span><span class="hljs-punctuation">{</span></span><span>
</span><span><span class="hljs-attr">"foo"</span></span><span><span class="hljs-punctuation">:</span></span><span> </span><span><span class="hljs-string">"bar"</span></span><span><span class="hljs-punctuation">,</span></span><span>
</span><span><span class="hljs-attr">"baz"</span></span><span><span class="hljs-punctuation">:</span></span><span> </span><span><span class="hljs-string">"qux"</span></span><span>
</span><span><span class="hljs-punctuation">}</span></span><span>
</span></span>
雖然json_decode本身不會格式化JSON 字符串,但開發者可以在進行json_encode時使用它,確保輸出更友好易讀。
PHP 5.4 還增強了json_decode的遞歸解析能力。現在,如果JSON 字符串中包含了嵌套的數組或對象, json_decode會更智能地處理這些遞歸結構,確保更複雜的JSON 數據能夠正確解析。例如:
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"person": {"name": "John", "age": 30}, "address": {"city": "New York", "zip": "10001"}}'</span></span><span>;
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">json_decode</span></span><span>(</span><span><span class="hljs-variable">$json</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>);
</span></span>
輸出:
<span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
[person] => </span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
[name] => John
[age] => </span><span><span class="hljs-number">30</span></span><span>
)
[address] => </span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
[city] => New York
[zip] => </span><span><span class="hljs-number">10001</span></span><span>
)
)
</span></span>
這種改進使得開發者不必擔心嵌套結構的複雜性,JSON 數據可以直接轉換成多維數組或對象。
PHP 5.4 版本中的json_decode函數在處理包含非ASCII 字符的JSON 字符串時,增強了對UTF-8 編碼的支持。儘管在PHP 5.3 及更早版本中, json_decode也支持UTF-8 編碼,但PHP 5.4 對此做了更嚴格的驗證,確保輸入數據是有效的UTF-8 編碼,否則會返回null 。
例如:
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"name": "José"}'</span></span><span>;
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">json_decode</span></span><span>(</span><span><span class="hljs-variable">$json</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$data</span></span><span>[</span><span><span class="hljs-string">'name'</span></span><span>]; </span><span><span class="hljs-comment">// 輸出 "José"</span></span><span>
</span></span>
這種改進確保了開發者在處理包含特殊字符的JSON 數據時,不會出現意外的解析錯誤或編碼問題。
PHP 5.4 在json_decode函數的錯誤處理上做了一些優化。當json_decode解析失敗時,返回null 。但要獲取更詳細的錯誤信息,可以使用json_last_error()函數。在PHP 5.4 之前,錯誤信息較為簡略,開發者可能很難確定具體的錯誤原因,而現在PHP 5.4 提供了更多的錯誤碼,能夠幫助開發者更精確地定位問題。
例如:
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"name": "John", "age":}'</span></span><span>; </span><span><span class="hljs-comment">// 錯誤的 JSON 格式</span></span><span>
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">json_decode</span></span><span>(</span><span><span class="hljs-variable">$json</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$data</span></span><span> === </span><span><span class="hljs-literal">null</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'JSON 解碼錯誤: '</span></span><span> . </span><span><span class="hljs-title function_ invoke__">json_last_error_msg</span></span><span>(); </span><span><span class="hljs-comment">// 輸出详细的错误信息</span></span><span>
}
</span></span>
這樣,開發者可以方便地識別和修復JSON 數據的格式問題。