在Android中将PHP响应字符串转换为JSON,总是说JSON字符串格式错误

时间:2018-04-03 14:51:07

标签: php android json

我正在尝试通过PHP将数据从服务器上的MSSQL表发送到Android应用程序。我正在使用Volley发送数据请求。

问题在于,无论我尝试什么,Android都说返回的JSON编码字符串是"格式错误"。

我已将返回的JSON字符串"响应"进入在线JSON解码器,它显示完美,但Andoid说:"语法错误,格式错误的JSON {"数据":[{" claimNumber":" f265e5e .. ...}]&#34 ;.

但是,如果我硬编码返回的"响应的复制和粘贴"将字符串转换为变量"输入"在Android中 响应功能,它完美无缺。

JSONObject jObj = new JSONObject(response); ** Fails - Android says Malformed.
JSONObject jObj = new JSONObject(input);  ** Android uses it with no issues.

以下是Android中用于接收PHP响应的方法。已包含"响应"的日志输出。字符串和 手动输入"输入"串。他们是相同的,但Android不会使用实际的#34;响应"字符串。

public void onResponse(String response) {
   if (response.equals("failed")) {
       Log.d("failed", "failed");
       callback.onResponse(null);
       return;
   }
    try {
// Android sees the response returned from the PHP function as always Malformed.
    Log.d("response", response);  
    D/response:  - Syntax error, malformed JSON {"data":[{"claimNumber":"f265e5e6513070abd1f711232cfd3a491075f15bc9714cf723e373f02e71a214","xlsLine":"8b3490231cd923c133989dd93574de131b6c388a86153a74eb6ae2507193a008c9d3d0264452cc1bd1113d5a722f3ea7975f322461f486be96e789424459e20bcbaf878f5d0efe09426b90c046d881100e166ef0bfcf8721266383aabf3837a213854e8425e92b722791640576d3c0ce7722ff3de2e6005c85df840bea3b10982b7bcf8bec3398ea03e08e6a2879cb29e0e6c3c05370e1c2cf819e6156991c762b2247e8a5b51edb852bb371aca011eccaa581ed577e74d6bf0f2a71e43e7751e3fa6e5f68c2a6e4ccd4fc338fc2a2ea4a9d98018c52fe5953741a53d7f7a6f1c1e57901d64c957dc1776ab0ed28f5754f7d44008ebc5864cfd34dd3b1f1bf82db49674b8e7a3e381882f7cc1035bfdba114280f6c173e337d1813fb47a9b1aaf1d52faac197f90cced9eea754cf441cb262b3117444ad3a265cefb9593d40cdb8a3ae0235cc06baffbcac493bf45852908b014f063c29d85347e808e7ed4be8688327bf3280759ea1ff187287dcabaaee8859a6da782cd2451e2911fe16ca7d","markerColor":"0","edited":"0"}]}

// If I copy the returned "response" string manually into a variable "input", Android says it's fine.
    String input = "{\"data\":[{\"claimNumber\":\"f265e5e6513070abd1f711232cfd3a491075f15bc9714cf723e373f02e71a214\",\"xlsLine\":\"8b3490231cd923c133989dd93574de131b6c388a86153a74eb6ae2507193a008c9d3d0264452cc1bd1113d5a722f3ea7975f322461f486be96e789424459e20bcbaf878f5d0efe09426b90c046d881100e166ef0bfcf8721266383aabf3837a213854e8425e92b722791640576d3c0ce7722ff3de2e6005c85df840bea3b10982b7bcf8bec3398ea03e08e6a2879cb29e0e6c3c05370e1c2cf819e6156991c762b2247e8a5b51edb852bb371aca011eccaa581ed577e74d6bf0f2a71e43e7751e3fa6e5f68c2a6e4ccd4fc338fc2a2ea4a9d98018c52fe5953741a53d7f7a6f1c1e57901d64c957dc1776ab0ed28f5754f7d44008ebc5864cfd34dd3b1f1bf82db49674b8e7a3e381882f7cc1035bfdba114280f6c173e337d1813fb47a9b1aaf1d52faac197f90cced9eea754cf441cb262b3117444ad3a265cefb9593d40cdb8a3ae0235cc06baffbcac493bf45852908b014f063c29d85347e808e7ed4be8688327bf3280759ea1ff187287dcabaaee8859a6da782cd2451e2911fe16ca7d\",\"markerColor\":\"0\",\"edited\":\"0\"}]}";

// Log showing Androids interpretation of the manually entered "input" string
// It matches the "response" string exactly yet "response" string fails.

    Log.d("input", input);  
    D/input: {"data":[{"claimNumber":"f265e5e6513070abd1f711232cfd3a491075f15bc9714cf723e373f02e71a214","xlsLine":"8b3490231cd923c133989dd93574de131b6c388a86153a74eb6ae2507193a008c9d3d0264452cc1bd1113d5a722f3ea7975f322461f486be96e789424459e20bcbaf878f5d0efe09426b90c046d881100e166ef0bfcf8721266383aabf3837a213854e8425e92b722791640576d3c0ce7722ff3de2e6005c85df840bea3b10982b7bcf8bec3398ea03e08e6a2879cb29e0e6c3c05370e1c2cf819e6156991c762b2247e8a5b51edb852bb371aca011eccaa581ed577e74d6bf0f2a71e43e7751e3fa6e5f68c2a6e4ccd4fc338fc2a2ea4a9d98018c52fe5953741a53d7f7a6f1c1e57901d64c957dc1776ab0ed28f5754f7d44008ebc5864cfd34dd3b1f1bf82db49674b8e7a3e381882f7cc1035bfdba114280f6c173e337d1813fb47a9b1aaf1d52faac197f90cced9eea754cf441cb262b3117444ad3a265cefb9593d40cdb8a3ae0235cc06baffbcac493bf45852908b014f063c29d85347e808e7ed4be8688327bf3280759ea1ff187287dcabaaee8859a6da782cd2451e2911fe16ca7d","markerColor":"0","edited":"0"}]}

        JSONObject jObj = new JSONObject(input);
        jArray = jObj.getJSONArray("data");
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

// GSON print of JSON Object from the manually entered "input" variable.
I/System.out: {
            "nameValuePairs": {
              "data": {
                "values": [
                  {
                    "nameValuePairs": {
                      "claimNumber": "f265e5e6513070abd1f711232cfd3a491075f15bc9714cf723e373f02e71a214",
                      "xlsLine": "8b3490231cd923c133989dd93574de131b6c388a86153a74eb6ae2507193a008c9d3d0264452cc1bd1113d5a722f3ea7975f322461f486be96e789424459e20bcbaf878f5d0efe09426b90c046d881100e166ef0bfcf8721266383aabf3837a213854e8425e92b722791640576d3c0ce7722ff3de2e6005c85df840bea3b10982b7bcf8bec3398ea03e08e6a2879cb29e0e6c3c05370e1c2cf819e6156991c762b2247e8a5b51edb852bb371aca011eccaa581ed577e74d6bf0f2a71e43e7751e3fa6e5f68c2a6e4ccd4fc338fc2a2ea4a9d98018c52fe5953741a53d7f7a6f1c1e57901d64c957dc1776ab0ed28f5754f7d44008ebc5864cfd34dd3b1f1bf82db49674b8e7a3e381882f7cc1035bfdba114280f6c173e337d1813fb47a9b1aaf1d52faac197f90cced9eea754cf441cb262b3117444ad3a265cefb9593d40cdb8a3ae0235cc06baffbcac493bf45852908b014f063c29d85347e808e7ed4be8688327bf3280759ea1ff187287dcabaaee8859a6da782cd2451e2911fe16ca7d",
                      "markerColor": "0",
                      "edited": "0"
                    }
                  }
                ]
              }
            }
          }

尝试使用和不使用斜杠的php输出。没有变化......仍然是畸形的。 试过剥离非标准字符。没有了。 强迫charset" UTF-8"。没有不同。 在Google上搜索并尝试了所有可想到的解决方案。什么都行不通。

我不知道接下来要尝试什么。完全混淆了为什么Android无法使用返回的Json字符串, 但如果手动使用相同的字符串并将其直接放在代码中的变量中,则可以使用它。

有人可以告诉我这是否是一个已知错误,如果JSON确实是格式错误或是否有其他想法?

谢谢

修改

这是创建json以返回Android的PHP。

$options =  array( "Scrollable" => SQLSRV_CURSOR_KEYSET );
$stmt2 = sqlsrv_query( $conn3, $tsql1, $params, $options); 
$row_count = sqlsrv_num_rows($stmt2);
if ($row_count === false) {
    echo("failed");
} else {
    while( $userClaims = sqlsrv_fetch_array($stmt2, SQLSRV_FETCH_ASSOC) ) {
        $claimNum = $userClaims['ClaimNumber'];
        $xls = $userClaims['XLS'];
        $color = $userClaims['Color'];
        $edited = "0";
            $keyvals = (object) array("claimNumber" => $claimNum, "xlsLine" => $xls, "markerColor" => $color, "edited" => $edited);
            array_push($response,$keyvals);
    }

    $encoded = json_encode(array('data' => $response));

编辑2

以下是创建json返回字符串的完整php代码段。数组在顶部初始化。已将php json字符串写入服务器上的文本文件,并将文本复制到json检查器,并且工作正常。

     $response = array();
        $i = 0;
        $param1 = $token;
        $params = array( &$param1);
        $tsql1 = "SELECT * FROM Claims WHERE Token = ? AND DeletionFlag = 0";
        $options =  array( "Scrollable" => SQLSRV_CURSOR_KEYSET );
        $stmt2 = sqlsrv_query( $conn3, $tsql1, $params, $options); 
        $row_count = sqlsrv_num_rows($stmt2);
        if ($row_count === false) {
            echo("failed");
        } else {
            while( $userClaims = sqlsrv_fetch_array($stmt2, SQLSRV_FETCH_ASSOC) ) {
                $claimNum = $userClaims['ClaimNumber'];
                $xls = $userClaims['XLS'];
                $color = $userClaims['Color'];
                $edited = "0";
                    $keyvals = (object) array("claimNumber" => $claimNum, "xlsLine" => $xls, "markerColor" => $color, "edited" => $edited);
                    array_push($response,$keyvals);
            }
            $encoded = json_encode(array('data' => $response));
            echo $encoded;
        }
sqlsrv_close($conn3);

1 个答案:

答案 0 :(得分:0)

谢谢你的帮助安迪。我终于弄明白了。我发现php文件中的一行代码不合适。它试图json_decode一个空字符串。这就是我在实际响应中生成关于格式错误字符串的额外36个字符的内容。一旦我将它移动到正确的位置,一切都开始美妙地工作。本应该知道的更好,很可能是一个blasted复制/粘贴错误。应该教我不要懒惰,实际输入我的所有代码。谢谢,再次!!