response возвращает не те данные
Мне нужно отправить запрос с JSONobject, он создался и работает нормально, вот код
JSONObject rootJson = null;
JSONObject itemObject = null;
try {
// создаем корневой элемент
rootJson = new JSONObject();
// создаем массив json объектов
JSONArray listJson = new JSONArray();
// создаем элемент списка
itemObject = new JSONObject();
// заполняем элемент списка
itemObject.put("id", productList.get(position).getId());
itemObject.put("qty", 11);
// кладем его в JSONArray
listJson.put(itemObject);
// который в свою очередь кладем в корневой элемент в поле list
rootJson.put("list", listJson);
rootJson.toJSONArray(a);
} catch (JSONException e) {
e.printStackTrace();
}
JSONObject finalRootJson = rootJson;
Запрос отправляю при помощи retrofit
Retrofit.Builder builder = new Retrofit.Builder().baseUrl("link")
.addConverterFactory(GsonConverterFactory.create());
Retrofit retrofit = builder.build();
IntApi api = retrofit.create(IntApi.class);
Call<JSONObject> call = api.add(finalRootJson);
call.enqueue(new Callback<JSONObject>() {
@Override
public void onResponse(Call<JSONObject> call, retrofit2.Response<JSONObject> response) {
Toast toast = Toast.makeText(context,
response.toString(), (Toast.LENGTH_SHORT));
toast.show();
}
@Override
public void onFailure(Call<JSONObject> call, Throwable t) {
Toast toast = Toast.makeText(context,
"Помилка" + t.getMessage(), Toast.LENGTH_SHORT);
toast.show();
}
});
}
});
IntApi
@POST("link")
Call<JSONObject> add(@Body JSONObject a);
В ответ в responce мне приходит та ссылка, куда я запрос отправляю. А должен приходить Json массив типа
{
"status": true,
"error": [],
"orderUrl": "url"
}
саму url мне нужно получить
Подсказали, что необходимо создать объект при помощи GSON. Нужен массив типа
{"list": [{ "id" : 2, "qty" : 11 }]}
Ответы (2 шт):
Вот можно сделать такую модель:
public class ArrayItem{
public int id;
public int qty;
}
public class MyModel{
public ArrayList<ArrayItem> list;
}
и сделать отправку так:
@POST("link")
Call<JSONObject> add(@Body MyModel a);
дальше вы создаете модель с нужными вам данными, и отправляете.
Насколько я помню ретрофит конвертирует тело запроса назначенным конвертером и я сомневаюсь что Gson конвертирует классы другой json-библиотеки в то, что вы ожидаете, даже если оно соответствует формату JSON для запроса.
Лучше сделать нормальный POJO, в этом могут помочь конвертеры, коих немало и в виде плагинов к IDE, и в онлайне, в других вариациях.
Пример POJO для строки {"list": [{ "id" : 2, "qty" : 11 }]}:
public class RootObjectModel {
public List<SubObjectModel> list;
}
public class SubObjectModel {
public int id;
public int qty;
}
Модель ответа тоже следует заменить на POJO или класс из библиотеки конвертера:
org.json.JSONObject -> com.google.gson.JsonObject