#android #retrofit
#Android #модернизация
Вопрос:
Я использую retrofit для ОТПРАВКИ массива 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]
Как это сделать с помощью retrofit?
Мой интерфейс выглядит следующим образом:
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);
Комментарии:
1. ваш второй формат json неверен. Внутри массива json вы не можете поместить значение типа 0:{«param1»: «value», «param2»:value} это.
2. да, синтаксис может быть неправильным, я не очень хорошо знаком с ним. но ключевым моментом является то, что сервер ожидает индексы массива. я не могу опубликовать массив без индексов.
3. затем вы можете вручную создать json и отправить в виде строки
4. не могли бы вы поделиться кодом вашего интерфейса ?
5. @shuvro Я отредактировал свой вопрос, пожалуйста, взгляните.
Ответ №1:
Один из способов решить вашу проблему — поместить json непосредственно в body, чтобы ваш интерфейс выглядел следующим образом
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();
}
Комментарии:
1. Спасибо за ответ. Но, похоже, вы предположили, что в моем массиве JSON есть только два элемента. На самом деле это может быть тысяча элементов в массиве
2. Я точно не знаю количество элементов в массиве
3. Я предполагаю, что вы создаете такой массив путем перебора списка или arraylist . Проверьте мою правку, с помощью которой вы можете использовать любое количество элементов
4. есть небольшая проблема. теперь моя строка выглядит следующим образом:
5. @MuhammadArsal как выглядит?