在 Android 與 PHP 後端互動時,常見的資料交換格式為 JSON。然而,Android 端若直接使用 toString() 方法將 JSONObject 轉為字串傳遞,會導致雙引號被 HTML 實體編碼(如 "),造成 PHP 端 json_decode() 解析失敗。本文詳細說明問題成因與解決步驟。
假設 Android 傳遞的原始 JSON 結構如下:
{"goods":{"100075":{"content":"哈哈"},"53":{"content":"真的嗎"},"50":{"content":"是不是"}}}
經 toString() 傳輸後,實際到達 PHP 的字串變為:
{"goods":{"100075":{"content":"哈哈"},"53":{"content":"真的嗎"},"50":{"content":"是不是"}}}
此時直接呼叫 json_decode($json) 會回傳 null,且 json_last_error() 會顯示語法錯誤。
使用 htmlspecialchars_decode() 將 " 還原為雙引號:
$json = htmlspecialchars_decode($receivedJsonString);
關鍵點: json_decode() 的第二個參數必須設為 true,否則會回傳物件而非陣列。
$data = json_decode($json, true);
<?php
// 假設從 POST 取得原始字串
$rawJson = $_POST['json_data'];
// 1. 還原跳脫字元
$cleanJson = htmlspecialchars_decode($rawJson);
// 2. 解碼為陣列(第二參數 true)
$data = json_decode($cleanJson, true);
if (json_last_error() !== JSON_ERROR_NONE) {
die('JSON 解析失敗:' . json_last_error_msg());
}
// 後續業務邏輯...
echo $data['goods']['100075']['content']; // 輸出:哈哈
?>
JSONObject.toString() 以外的方式,例如使用 OkHttp 的 RequestBody.create(MediaType.parse("application/json"), jsonObject.toString()) 直接發送 JSON 本體,避免雙重編碼。decodeAndroidJson($str) 統一處理。json_validate() (PHP 8.3+) 或 json_decode() 檢查格式再處理。核心口訣:先 htmlspecialchars_decode,再 json_decode(..., true)。掌握此流程,即可順利處理 Android 傳遞的 JSON 資料。