如何将json从android发送到php?

MCh*_*ker 5 php java android json android-volley

要将json从android发布到php,我使用了Volley库StringRequest对象.

StringRequest sr = new StringRequest(Request.Method.POST,url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                // some code
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                //some code
            }
        }){
            @Override
            protected Map<String,String> getParams(){
                Map<String, String> params = new HashMap<String, String>();
                ArrayList<Command> commands = MyApplication.readFromPreferences(getActivity(), Constants.COMMAND);
                String jsonCommands = new Gson().toJson(commands);
                params.put("commands", jsonCommands);
                return params;
            }
        };
Run Code Online (Sandbox Code Playgroud)

为了捕获php中的数据并验证它是否被正确发送,我使用了这个

echo $_POST["commands"]; 
Run Code Online (Sandbox Code Playgroud)

输出:

[{\"product\":{\"category_id\":1,\"created_at\":\"2015-06-13 17:49:58\",\"description\":\"CF77 COIN FINDER\",\"url_image\":\"IMG_76ECDC-707E7E-70AC81-0A1248-4675F3-F0F783.jpg\",\"name\":\"CF77 COIN FINDER\",\"pid\":12,\"price\":500.0},\"product_quantity\":3},{\"product\":{\"category_id\":1,\"created_at\":\"2015-06-13 17:49:58\",\"description\":\"JEOSONAR 3D DUAL SYSTEM\",\"url_image\":\"IMG_2D9DF0-2EB7E9-ED26C0-2C833B-B6A5C5-5C7C02.jpg\",\"name\":\"JEOSONAR 3D DUAL SYSTEM\",\"pid\":15,\"price\":500.0},\"product_quantity\":1},{\"product\":{\"category_id\":1,\"created_at\":\"2015-06-13 17:49:58\",\"description\":\"MAKRO POINTER\",\"url_image\":\"IMG_Macro.jpg\",\"name\":\"MAKRO POINTER\",\"pid\":18,\"price\":500.0},\"product_quantity\":3}]
Run Code Online (Sandbox Code Playgroud)

我注意到,当使用Volley库发送带有POST方法的json字符串时,添加了许多反斜杠来转义双引号.

所以这是我的问题:

我想将json解码为php中的一个对象数组,所以我使用了

$commands = json_decode( $_POST["commands"],true);
Run Code Online (Sandbox Code Playgroud)

但它总是返回一个空数组,因为json上面的invalide(由反斜杠引起).

在php或java SDK中是否有一个方法提供了发送和接收json的合同而没有这种问题?或者我应该重新格式化PHP中的json并删除所有的反斜杠?

MCh*_*ker 0

最后,我使用自定义json_decode方法解决了我的问题,以便在解码之前清理 json 字符串。

function json_clean_decode($json, $assoc = false, $depth = 512, $options = 0) {
    // search and remove comments like /* */ and //
    $json = preg_replace("#(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|([\s\t]//.*)|(^//.*)#", '', $json);
    // search and remove all backslashes
    $json = str_replace("\\","", $json);

    if(version_compare(phpversion(), '5.4.0', '>=')) {
        $json = json_decode($json, $assoc, $depth, $options);
    }
    elseif(version_compare(phpversion(), '5.3.0', '>=')) {
        $json = json_decode($json, $assoc, $depth);
    }
    else {
        $json = json_decode($json, $assoc);
    }

    return $json;
}
Run Code Online (Sandbox Code Playgroud)