Как отправить json из android на php?

Чтобы отправить json из android в php, я использовал объект StringRequest библиотеки 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; } }; 

И чтобы поймать данные в php и проверить, правильно ли он отправлен, я использовал это

 echo $_POST["commands"]; 

Вывод:

 [{\"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}] 

Я заметил, что при отправке json-строки методом POST с использованием библиотеки Volley было добавлено много анти-косаемых черт, чтобы избежать двойных кавычек.

Итак, вот моя проблема:

Я хочу декодировать json для массива объектов в php, поэтому я использовал

 $commands = json_decode( $_POST["commands"],true); 

Но он всегда возвращает пустой массив из-за invalide выше json (вызванный анти-косой чертой).

Есть ли способ в php или в java SDK, предоставляющий контракт на отправку и получение json без каких-либо проблем? Или я должен переформатировать json в php и удалить все анти-косые черты?

Проблема в том, что вы пытаетесь отправить данные json в параметры URL.

Вам нужно переопределить метод getBody() чтобы вернуть данные json в качестве тела запроса, а не как параметры URL.

Например:

 /** * Returns the raw POST or PUT body to be sent. * * @throws AuthFailureError in the event of auth failure */ public byte[] getBody() throws AuthFailureError { return new Gson().toJson(commands).getBytes(); } 

А затем в PHP вы можете:

$jsonRequest = json_decode(stream_get_contents(STDIN));

сначала возникает проблема с тем, что сам json не правильно построен для JSONObject для этого, например:

 JSONObject js = new JSONObject(); try { js.put("value",10); } catch (JSONException e) { e.printStackTrace(); } String jss = js.toString(); 

вы можете проверить, успешно ли синтаксический анализ, скопируйте строку и скопируйте ее в онлайн-парсер, как это http://json.parser.online.fr/

Наконец, я решил свою проблему, используя специальный метод 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; } 

Вы можете использовать этот метод для отправки json в веб-службу.

 public String makeServiceCallSubmit(String url, int method, JSONArray object) { try { // http client DefaultHttpClient httpClient = new DefaultHttpClient(); HttpEntity httpEntity = null; HttpResponse httpResponse = null; // Checking http request method type if (method == POST) { HttpPost httpPost = new HttpPost(url); httpPost.setHeader("Content-type", "application/json"); StringEntity se = new StringEntity(object.toString()); // se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); httpPost.setEntity(se); httpResponse = httpClient.execute(httpPost); } httpEntity = httpResponse.getEntity(); Response = EntityUtils.toString(httpEntity); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return Response; }