當前位置: 首頁> 最新文章列表> json_decode 函數如何解析非標準格式的JSON 字符串,有哪些實用技巧?

json_decode 函數如何解析非標準格式的JSON 字符串,有哪些實用技巧?

gitbox 2025-06-22

在PHP 中, json_decode函數通常用於解析符合標準格式的JSON 字符串並將其轉換為PHP 數據類型。標準JSON 字符串要求鍵名必須是雙引號( " " )包圍的,字符串值必須是有效的Unicode 字符等。然而,在實際開發中,我們可能會遇到非標準格式的JSON 字符串,如何有效解析這些字符串成為一個挑戰。本文將探討如何使用json_decode函數處理非標準格式的JSON 字符串,並分享一些實用技巧。

1. 處理單引號的JSON 字符串

標準的JSON 字符串要求使用雙引號( " " )來包裹鍵名和字符串值,但有時我們會遇到鍵名或字符串值使用單引號( ' ' )的情況。 PHP 的json_decode並不直接支持單引號,但我們可以通過一些簡單的替換,將其轉換為標準的JSON 格式。

示例:

 <span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">"{'name':'John', 'age':30}"</span></span><span>;
</span><span><span class="hljs-variable">$correctedJson</span></span><span> = </span><span><span class="hljs-title function_ invoke__">str_replace</span></span><span>([</span><span><span class="hljs-string">"'"</span></span><span>, </span><span><span class="hljs-string">'"'</span></span><span>], [</span><span><span class="hljs-string">'"'</span></span><span>, </span><span><span class="hljs-string">'"'</span></span><span>], </span><span><span class="hljs-variable">$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">$correctedJson</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>

在這個示例中,我們使用str_replace函數將所有單引號替換為雙引號,這樣json_decode就可以順利解析該字符串。

2. 處理不完整的JSON 字符串

有時我們可能遇到一些不完整的JSON 字符串,例如缺少閉合的括號或逗號。這類情況會導致json_decode返回null 。為了處理這種情況,我們可以先使用正則表達式或簡單的字符串操作來補全這些不完整的部分。

示例:

 <span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"name":"John", "age":30'</span></span><span>;  </span><span><span class="hljs-comment">// 缺少閉合大括號</span></span><span>
</span><span><span class="hljs-variable">$fixedJson</span></span><span> = </span><span><span class="hljs-title function_ invoke__">rtrim</span></span><span>(</span><span><span class="hljs-variable">$json</span></span><span>, </span><span><span class="hljs-string">','</span></span><span>) . </span><span><span class="hljs-string">'}'</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">$fixedJson</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>

通過這種方法,我們可以避免手動檢查每個JSON 字符串,並確保解析的準確性。

3. 處理JSON 字符串中的多餘的逗號

在某些非標準JSON 字符串中,數組或對像中的元素後可能會多一個逗號( , )。這種情況雖然在標準JSON 中是非法的,但我們可以通過簡單的字符串替換來刪除多餘的逗號,保證json_decode可以正確解析。

示例:

 <span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"name":"John", "age":30,}'</span></span><span>;  </span><span><span class="hljs-comment">// 多了一個逗號</span></span><span>
</span><span><span class="hljs-variable">$fixedJson</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/,\s*([}\]])/'</span></span><span>, </span><span><span class="hljs-string">'$1'</span></span><span>, </span><span><span class="hljs-variable">$json</span></span><span>);  </span><span><span class="hljs-comment">// 去除尾部多餘的逗號</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">$fixedJson</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>

在這裡, preg_replace函數用於查找和刪除結尾處的多餘逗號,使其符合JSON 格式。

4. 處理特殊字符編碼問題

如果JSON 字符串中包含特殊字符,例如中文字符或者非ASCII 字符, json_decode函數可能會因為字符編碼問題而解析失敗。確保JSON 字符串採用UTF-8 編碼,並在解析時使用正確的字符集,可以避免此類問題。

示例:

 <span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"name":"中文", "age":30}'</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_UNESCAPED_UNICODE);
</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>

在這個例子中, JSON_UNESCAPED_UNICODE選項讓json_decode解析過程中不對Unicode 字符進行轉義,保持原始字符編碼。

5. 忽略未知的鍵

有時我們會遇到一些不符合預期結構的JSON 字符串,這些字符串可能包含多餘的鍵或者某些不需要的字段。通過傳遞第二個參數true ,可以將JSON 字符串解析為關聯數組,這樣可以輕鬆地跳過不需要的字段,保留有用的數據。

示例:

 <span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"name":"John", "age":30, "extraField":"value"}'</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-comment">// 解析為關聯數組</span></span><span>
</span><span><span class="hljs-keyword">unset</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>[</span><span><span class="hljs-string">'extraField'</span></span><span>]);  </span><span><span class="hljs-comment">// 刪除不需要的字段</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>

這段代碼演示瞭如何忽略JSON 字符串中的某些字段,並只保留需要的數據。

6. 設置json_decode的錯誤處理機制

如果解析過程中發生錯誤, json_decode將返回null 。為了提高代碼的健壯性,通常我們需要在解析之前或之後檢查是否發生了錯誤。 PHP 提供了json_last_error()json_last_error_msg()函數來獲取JSON 解析的錯誤信息。

示例:

 <span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"name":"John", "age":30}'</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">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">json_last_error</span></span><span>() !== JSON_ERROR_NONE) {
    </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-keyword">else</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>

通過這種方式,我們可以準確捕獲JSON 解析中的錯誤並進行相應處理。

結語

在處理非標準格式的JSON 字符串時, json_decode函數本身提供了很強的靈活性,通過一些字符串處理技巧,通常可以解決大部分問題。關鍵在於準確識別問題所在,並採取合適的處理方式。通過本文分享的幾種技巧,您可以更加高效地處理JSON 數據,提高代碼的健壯性和穩定性。