Ожидался begin_array, но был begin_object в строке 1, столбец 2, модернизация 2

Я использую модификацию 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);

Как исправить это исключение

Код вашего сервера генерирует JSON из один объект, но вашему клиентскому коду требуется List, он же JSON множество, который является точно, что сообщение об ошибке сообщает вам: JSON - это объект ("был begin_object"), и вы пытаетесь проанализировать его как массив ("ожидаемый begin_array"). Что вас смущает? --- Чтобы исправить: измените одно или другое, т.е. либо измените сервер для создания списка, либо измените клиента, ожидающего объекта. Какая часть это вас смущает?

Andreas 04.04.2018 18:09
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы получаете 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();
}

это означает, что результатом ответа является один объект, но вы вызываете список. Изменить вызов> на вызов

Другие вопросы по теме