2013-06-27 3 views
3

Я пытаюсь отправить объект JSON, который содержит массив JSON с объектами JSON внутри через HTTP POST-параметры.Отправка JSON в качестве параметра HTTP POST (Android/Java)

Формат параметра (то, что ожидает, что сервер) это что-то вроде:

{""team"":[ 
    {""teamid"":""179228"",""position"":1}, 
    {""teamid"":""218036"",""position"":2}, 
    {""teamid"":""88109"",""position"":3}, 
    {""teamid"":""88111"",""position"":4}, 
    {""teamid"":""165536"",""position"":5}, 
    {""teamid"":""224645"",""position"":6} 
]} 

тем не менее, то, что отправляется в:

{"team":"[ 
\"{\\\"position\\\":0,\\\"teamid\\\":\\\"88107\\\"}\",\"{\\\"position\\\":1,\\\"teamid\\\":\\\"88109\\\"}\",\"{\\\"position\\\":2,\\\"teamid\\\":\\\"156714\\\"}\",\"{\\\"position\\\":3,\\\"teamid\\\":\\\"138877\\\"}\",\"{\\\"position\\\":4,\\\"teamid\\\":\\\"168730\\\"}\",\"{\\\"position\\\":5,\\\"teamid\\\":\\\"88110\\\"}\",\"{\\\"position\\\":6,\\\"teamid\\\":\\\"88111\\\"}\",\"{\\\"position\\\":7,\\\"teamid\\\":\\\"134431\\\"}\",\"{\\\"position\\\":8,\\\"teamid\\\":\\\"88112\\\"}\",\"{\\\"position\\\":9,\\\"teamid\\\":\\\"138507\\\"}\",\"{\\\"position\\\":10,\\\"teamid\\\":\\\"138880\\\"}\",\"{\\\"position\\\":11,\\\"teamid\\\":\\\"138881\\\"}\",\"{\\\"position\\\":12,\\\"teamid\\\":\\\"151465\\\"}\",\"{\\\"position\\\":13,\\\"teamid\\\":\\\"151464\\\"}\ 
"]"} 

Как я построить этот объект JSON является следующее :

  JSONArray teamArray = new JSONArray(); 
      JSONObject jsonRoot = new JSONObject(); 
      for (int i = 0; i < mTeams.size(); i++) { 
       String teamId = null; 
       BaseModel data = mTeams.get(i); 
       if (data != null && data instanceof TeamModel) { 
        teamId = ((TeamModel) data).getId(); 
       } 
       JSONObject teamObject = new JSONObject(); 
       try { 
        teamObject.put(
          getResources().getString(
            R.string.sendResortedTeamsPosition), i); 
        teamObject.put(
          getResources().getString(
            R.string.sendResortedTeamsTeamId), teamId); 
        teamArray.put(teamObject); 
       } catch (NotFoundException e) { 
        e.printStackTrace(); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
      try { 
       jsonRoot.put("team", teamArray); 
       mNameValuePairs.put("teams", jsonRoot); 
        } catch (JSONException e) { 
       e.printStackTrace(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

В последней, но одна линия (jsonRoot.put("team", teamArray);) имеет тот же формат как то, что отправляется в последней строке, но с одним менее \, поэтому один раз «разбор» явно.

Часть моего HTTP код:

String postBody = json.toString(); 
Log.d("HTTPHelper", "posting JSON: " + postBody); 
((HttpPost) httpRequest).setEntity(new StringEntity(postBody)); 

Почему это происходит? Это Java? Любые идеи, как я могу построить правильный JSON? или любая работа вокруг?

Большое спасибо!

+1

мы можем видеть конец кода. Кроме того, как ваши данные в файле strings.xml? (вы не должны добавлять никаких символов \ или "). Кроме того, возможно, у вас есть опечатки на ожидаемой стороне сервера JSON: двойная двойная кавычка неверна :) – mithrop

+0

@mithrop проблема в том, что в iOS это работает отлично , но в Android у меня много проблем, поэтому проблема не должна быть на стороне сервера ... BTW Я только что добавил последнюю часть кода - просто пару высказываний 'catch' – noloman

+0

нормально. ответьте на данные в файле strings.xml? – mithrop

ответ

1

Я дал это, и решил пойти грязно-путь: замена символов вручную следующим образом:

json = new JSONObject(nameValuePairs.toString().replace("\"", "'")); 
json = new JSONObject(json.toString().replace("\"", "")); 

Это некрасиво, наверное, опасно или рискованно, но это работает ...

1

Слишком много кода для этой задачи, проверка этой библиотеки https://github.com/kodart/Httpzoid Он использует GSON внутри себя и предоставляет API, который работает с объектами. Все детали JSON скрыты.

Http http = HttpFactory.create(context); 
http.get("http://example.com/users") 
    .handler(new ResponseHandler<User[]>() { 
     @Override 
     public void success(User[] users, HttpResponse response) { 
     } 
    }).execute(); 
0

только кончик ... Я на самом деле не в андроида, только Java .. но вы можете Де- и кодировать с JSON Base64 с обеих сторон, и передать закодированное «String».

, так что вам не нужно беспокоиться о замене «грязного пути».

надеюсь, что это поможет вам или другим. :)