2013-06-27 35 views
3

我想通過HTTP POST參數發送一個包含JSON對象的JSON對象。發送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服務器端有一些錯別字:double double-quote is not correct :) – mithrop

+0

@mithrop問題是,在iOS中,這是完美的,但在Android我有很多麻煩,所以問題不應該是服務器端...順便說一句我剛剛添加了代碼的最後一部分 - 只是幾個'catch'語句 – noloman

+0

好吧,你還能關於string.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

只是一個提示...我還沒有真正進入Android的,不僅僅是Java .. 但你可以去和編碼使用Base64的JSON兩側,並通過編碼「字符串」。

所以你不必擔心任何「髒方式」替換。

希望這可以幫助你或他人。 :)