Я использую модификацию 2 в android для получения данных в формате json с сервера и использования их как объекта. Я работаю над netbeans для серверной части. но это дает мне следующее исключение, о котором я упоминал выше. Это мой клиентский (Android) код
Retrofit.Builder builder = new Retrofit.Builder()
.baseUrl("http://192.168.1.6:8080/")
.addConverterFactory(GsonConverterFactory.create());
Retrofit retrofit = builder.build();
DriverClient driver = retrofit.create(DriverClient.class);
Call<List<Driver>> call = driver.getDriverName();
call.enqueue(new Callback<List<Driver>>() {
@Override
public void onResponse(Call<List<Driver>> call, Response<List<Driver>> response) {
List<Driver> list = response.body();
Toast.makeText(MainActivity.this, "Size : " + list.size(), Toast.LENGTH_SHORT).show();
Driver driver = list.get(0);
String name = driver.getName();
Toast.makeText(MainActivity.this, "Name : " + name , Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(Call<List<Driver>> call, Throwable t) {
Toast.makeText(MainActivity.this, "Error : " + t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
Вот класс драйвера
public class Driver {
@SerializedName("name")
private String name;
public Driver(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
и вот интерфейс DriverClient
public interface DriverClient {
@GET("/Final/image")
Call<List<Driver>> getDriverName();
}
Это простой код на стороне сервера
JSONObject json = new JSONObject();
json.put("name", "Hafiz Hamza");
response.setContentType("text/plain");
response.setHeader("chache-control", "no cache");
PrintWriter out = response.getWriter();
out.println(json);
Как исправить это исключение




Вы получаете object со своей конечной точки, поэтому ожидайте object на стороне вашего приложения (здесь вы ожидаете array со стороны приложения)
Попробуй это
Retrofit.Builder builder = new Retrofit.Builder()
.baseUrl("http://192.168.1.6:8080/")
.addConverterFactory(GsonConverterFactory.create());
Retrofit retrofit = builder.build();
DriverClient driver = retrofit.create(DriverClient.class);
Call<Driver> call = driver.getDriverName();
call.enqueue(new Callback<Driver>() {
@Override
public void onResponse(Call<Driver> call, Response<Driver> response) {
Driver driver = response.body();
Toast.makeText(MainActivity.this, "Size : " + list.size(), Toast.LENGTH_SHORT).show();
String name = driver.getName();
Toast.makeText(MainActivity.this, "Name : " + name , Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(Call<Driver> call, Throwable t) {
Toast.makeText(MainActivity.this, "Error : " + t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
и ваш интерфейс api
public interface DriverClient {
@GET("/Final/image")
Call<Driver> getDriverName();
}
это означает, что результатом ответа является один объект, но вы вызываете список. Изменить вызов> на вызов
Код вашего сервера генерирует JSON из один объект, но вашему клиентскому коду требуется
List, он же JSON множество, который является точно, что сообщение об ошибке сообщает вам: JSON - это объект ("был begin_object"), и вы пытаетесь проанализировать его как массив ("ожидаемый begin_array"). Что вас смущает? --- Чтобы исправить: измените одно или другое, т.е. либо измените сервер для создания списка, либо измените клиента, ожидающего объекта. Какая часть это вас смущает?