首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 接收 Android 傳遞 JSON 資料並轉換為陣列的完整解決方案

     編輯:PHP 相關知識

前言

在 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() 會顯示語法錯誤。

解決方案

步驟 1:還原 HTML 實體

使用 htmlspecialchars_decode() 將 " 還原為雙引號:

$json = htmlspecialchars_decode($receivedJsonString);

步驟 2:正確解碼為關聯陣列

關鍵點: 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']; // 輸出:哈哈
?>

補充建議

  • Android 端建議改用 JSONObject.toString() 以外的方式,例如使用 OkHttp 的 RequestBody.create(MediaType.parse("application/json"), jsonObject.toString()) 直接發送 JSON 本體,避免雙重編碼。
  • PHP 端可封裝為工具函數 decodeAndroidJson($str) 統一處理。
  • 若資料來源不可控,建議先用 json_validate() (PHP 8.3+) 或 json_decode() 檢查格式再處理。

總結

核心口訣:先 htmlspecialchars_decode,再 json_decode(..., true)。掌握此流程,即可順利處理 Android 傳遞的 JSON 資料。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved