2016-10-22 64 views
0

我正在使用retrofit POST json數組到服務器。數據是這樣的:POST JSON數組索引使用改進

{something: 
    {somethings: 
     [ 
      {"param1":"value", "param2":value}, 
      {"param1":"value", "param2":value} 
     ] 
    } 
} 

然而,我的服務器的力量我必須包括像數組中的索引:

{something: 
    {somethings: 
     { 
     "0":{"param1":"value", "param2":value}, 
     "1":{"param1":"value", "param2":value} 
     } 
    } 
} 

換句話說無法發送的參數是這樣的:

something[somethings][][param1] 
something[somethings][][param2] 

我必須包含索引:

something[somethings][0][param1] 
something[somethings][0][param2] 

如何使用改造來做到這一點?

我的界面看起來是這樣的:

interface ApiService { 
    @POST("endpoint") 
    public Callback<Something> postSomething (@Body Something something); 
} 

我的類看起來像下面:

public class PostSomething { 
    private MapOfSomething something = new MapOfSomething(); 

    public MapOfSomething getSomething() { 
     return portfolio; 
    } 

    public void setSomething(MapOfSomething something) { 
     this.something = something; 
    } 
} 

public class MapOfSomething { 
    private JSONObject somethings = new JSONObject(); 

    public JSONObject getPortfolios() { 
     return somethings; 
    } 

    public void setSomethings(List<Something> somethingList) { 

     for (int i = 0; i<somethingList.size(); i++) { 

      try { 
       somethings.put(String.valueOf(i).toString(), somethingList.get(i)); 
      } catch (JSONException e) { 
      e.printStackTrace(); 
      } 
     } 
    } 

}

,並調用類的方法:

PostSomethings something = new PostSomethings(); 
MapOfSomething map = new mapOfSomething(); 
map.setSomethings(listofSomething); 
something.setSomethings(map); 
apiService.postSomething(something); 
+0

你的第二個JSON格式是錯誤的。裏面的json數組,你不能把像0這樣的值:{「param1」:「value」,「param2」:value} this。 –

+0

是的語法可能是錯的,我不是很熟悉它。但關鍵是,服務器期望數組的索引。我不能POST數組沒有索引。 –

+0

然後您可以手動創建json並以字符串形式發送 –

回答

1

的一種方式解決你的問題EM是直接把JSON進入體內,使你的界面看起來像這樣

interface ApiService { 
    @POST("endpoint") 
    public Callback<Something> postSomething (@Body JSONObject jsonObject); 
} 

現在,您需要創建的JSONObject,這裏是如何我已經創建了所需的JSONObject

JSONObject mainJson = new JSONObject(); 

    JSONArray list = new JSONArray(); 

    JSONObject singleElement1 = new JSONObject(); 

    try { 
     singleElement1.put("param1","value1"); 
     singleElement1.put("param2","value2"); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

    JSONObject singleElementSet1 = new JSONObject(); 

    try { 
     singleElementSet1.put("1",singleElement1); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 


    JSONObject singleElement2 = new JSONObject(); 

    try { 
     singleElement2.put("param1","value1"); 
     singleElement2.put("param2","value2"); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

    JSONObject singleElementSet2 = new JSONObject(); 

    try { 
     singleElementSet2.put("2",singleElement2); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 


    list.put(singleElementSet1); 
    list.put(singleElementSet2); 


    JSONObject subJson = new JSONObject(); 

    try { 
     subJson.put("something",list); 
     mainJson.put("something",subJson); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 


    Log.d("json",""+mainJson.toString()); 

我假設現在你在呼喚你的服務像這樣

Call<Something> call = instanceOfYourAPIService.postSomething(anInstanceOfSomethingObject); 

但現在你必須與以下

替換此
Call<Something> call = instanceOfYourAPIService.postSomething(mainJson); //mainJson is the JSONObject which is created earlier 

希望它可以幫助

編輯

 JSONObject mainJson = new JSONObject(); 

     JSONObject singleElement1 = new JSONObject(); 

     try { 
      singleElement1.put("param1","value1"); 
      singleElement1.put("param2","value2"); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 


     JSONObject singleElement2 = new JSONObject(); 

     try { 
      singleElement2.put("param1","value1"); 
      singleElement2.put("param2","value2"); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 


     ArrayList<JSONObject> jsonObjectArrayList = new ArrayList<JSONObject>(); 

     //hope you can add item to this arraylist via some loop 
     jsonObjectArrayList.add(singleElement1); 
     jsonObjectArrayList.add(singleElement2); 



     JSONArray list = new JSONArray(); 


     for(int i = 0;i<jsonObjectArrayList.size();i++){ 


      JSONObject elementSet = new JSONObject(); 
      try { 
       elementSet.put(String.valueOf(i).toString(),jsonObjectArrayList.get(i)); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

      list.put(elementSet); 
     } 


     JSONObject subJson = new JSONObject(); 

     try { 
      subJson.put("something",list); 
      mainJson.put("something",subJson); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
+0

感謝您的回答。但它看起來像你認爲我的JSON數組中只有兩個元素。實際上它可以是數組中的一千個元素 –

+0

我不完全知道數組中元素的數量 –

+0

我假設您通過迭代列表或數組列表來創建此類數組。檢查我的編輯,通過它你可以有任何數量的元素 –