當前位置: 首頁> 最新文章列表> PHP 5.4+ 中json_decode 有哪些新特性?開發者必須知道的變化

PHP 5.4+ 中json_decode 有哪些新特性?開發者必須知道的變化

gitbox 2025-08-26

1. JSON_BIGINT_AS_STRING常量

在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>

這種方式尤其適合需要處理金融、科學計算等領域的應用,它可以確保數值的精度不受影響。

2. JSON_PRETTY_PRINT輸出格式化

雖然JSON_PRETTY_PRINT常量早在PHP 5.3 中就已經存在,但其對json_decode函數的行為發生了變化。在PHP 5.4 中, JSON_PRETTY_PRINT主要影響的是json_encode函數的輸出格式,而不再影響json_decode 。不過,了解這個常量的作用仍然是很重要的,因為它能幫助開發者在調試時更容易閱讀和理解JSON 數據的結構。

舉個例子, json_encodeJSON_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> =&gt; </span><span><span class="hljs-string">'bar'</span></span><span>, </span><span><span class="hljs-string">'baz'</span></span><span> =&gt; </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時使用它,確保輸出更友好易讀。

3. 遞歸數組和對象的處理

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] =&gt; </span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
        (
            [name] =&gt; John
            [age] =&gt; </span><span><span class="hljs-number">30</span></span><span>
        )
    [address] =&gt; </span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
        (
            [city] =&gt; New York
            [zip] =&gt; </span><span><span class="hljs-number">10001</span></span><span>
        )
)
</span></span>

這種改進使得開發者不必擔心嵌套結構的複雜性,JSON 數據可以直接轉換成多維數組或對象。

4. 支持UTF-8 編碼的字符串

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 數據時,不會出現意外的解析錯誤或編碼問題。

5. 錯誤處理的改進

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 數據的格式問題。