Nano Hash - криптовалюты, майнинг, программирование

Ошибка модернизации 2: java.lang.IllegalStateException: ожидался BEGIN_OBJECT, но был STRING в строке 6 столбца 1 пути

Помогите мне с этой проблемой, пожалуйста, код выглядит следующим образом

Мероприятия

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TaskData taskData= new TaskData();
        taskData.setEmail("[email protected]");
        Task task= new Task();
        task.setTaskData(taskData);
        Log.v("@@@WWE"," Call Initiated");
        task.setTask("getUserDetail");


        JSONObject taskDatas= new JSONObject();

        JSONObject taskM= new JSONObject();
        try {
            taskDatas.put("email","[email protected]");
            taskM.put("task","getUserDetail");
            taskM.put("taskData",taskDatas);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        Map<String,JSONObject> taskMap= new HashMap<>();
        taskMap.put("reqObject",taskM);
        getUserDetails(taskMap);
        Log.v("@@@WWE"," Call Over");
    }

  public void getUserDetails(Map<String,JSONObject> task){
        ServiceInterfaceApi interfaceApi= ServiceClass.getApiService();
        Call<UserList>call=interfaceApi.getUserDetails(task);
        Log.v("@@@WWE","Retrofit Request Method =  "+call.request().method());
        Log.v("@@@WWE","Retrofit Request Body =  "+call.request().body());
        Log.v("@@@WWE","Retrofit Request Url = "+call.request().url());
        Log.v("@@@WWE","Retrofit Request executed = "+call.isExecuted());
        call.enqueue(new Callback<UserList>() {
            @Override
            public void onResponse(Call<UserList> call, Response<UserList> response) {
                Log.v("@@@","Response");
                if (response.isSuccessful()){
                    Log.v("@@@","Sucess");
                    userList=response.body().getUserData();
                    for (int i = 0; i < userList.size(); i++) {
                        UserDatum userDatum=userList.get(i);
                        Log.v("@@@@WWE"," USer Email "+userDatum.getEmail());
                        Log.v("@@@@WWE"," USer Name "+userDatum.getName());
                        Log.v("@@@@WWE"," USer Gender "+userDatum.getGender());
                    }
                }
                if(response.code()==400){
                    Toast.makeText(Home.this,"400 code ",Toast.LENGTH_LONG).show();
                }
            }
            @Override
            public void onFailure(Call<UserList> call, Throwable t) {
                Log.v("@@@WWE","Failure "+t.getMessage());
            }
        });
    }

Сервисный интерфейс

@Headers("Content-Type: application/json")
@POST("index.php")
    Call<UserList>getUserDetails(@QueryMap Map<String,JSONObject> stringTaskMap);

Класс обслуживания

public class ServiceClass {
    public ServiceClass() {
    }

    private static Retrofit getRetroClient(){
        Gson gson = new GsonBuilder()
                .setLenient()
                .create();
        return new Retrofit.Builder()
                .baseUrl(HttpConstants.baseUrl)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();
    }

    public static ServiceInterfaceApi getApiService(){
        return getRetroClient().create(ServiceInterfaceApi.class);
    }
}

Класс Пожо:

public class UserList {

    @SerializedName("userData")
    @Expose
    private List<UserDatum> userData = null;
    @SerializedName("code")
    @Expose
    private Integer code;
    @SerializedName("message")
    @Expose
    private String message;

    public List<UserDatum> getUserData() {
        return userData;
    }

    public void setUserData(List<UserDatum> userData) {
        this.userData = userData;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

}

public class UserDatum {

    @SerializedName("email")
    @Expose
    private String email;
    @SerializedName("password")
    @Expose
    private String password;
    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("image")
    @Expose
    private String image;
    @SerializedName("mobile")
    @Expose
    private String mobile;
    @SerializedName("birth_date")
    @Expose
    private String birthDate;
    @SerializedName("dateofregister")
    @Expose
    private String dateofregister;
    @SerializedName("gender")
    @Expose
    private String gender;

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    public String getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(String birthDate) {
        this.birthDate = birthDate;
    }

    public String getDateofregister() {
        return dateofregister;
    }

    public void setDateofregister(String dateofregister) {
        this.dateofregister = dateofregister;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

}

Ожидаемый ответ

{"userData":[{"email":"[email protected]","password":"12345","name":"foo bar","image":"foo","mobile":"123","birth_date":"12345646","dateofregister":"1493706304000","gender":"male"}],"code":200,"message":"DONE"}

вот мое сообщение об ошибке Ошибка java.lang.IllegalStateException: Ожидается BEGIN_OBJECT, но это STRING в строке 6, столбец 1, путь $ Спасибо заранее


  • я проверил в клиенте REST, он работает 17.05.2017
  • покажи свой класс pojo 17.05.2017
  • @Kriti: проверь сейчас 17.05.2017
  • Можете ли вы показать исключение? 17.05.2017
  • @ Ошибка кузнечика java.lang.IllegalStateException: ожидалось BEGIN_OBJECT, но было STRING в строке 6 столбца 1 пути $ 17.05.2017
  • попробуйте один раз на почтальоне .. потому что ваш код выглядит правильно. 17.05.2017

Ответы:


1

Как сказано в исключении, вы получаете объект, но он инициализируется как String. В POJO только строка является сообщением, поэтому очевидно, что проблема в этом. Сообщение — это какой-то объект, и, вероятно, внутри него находится настоящая строка. Так что просто создайте объект сообщения, а затем извлеките строковое сообщение изнутри. Сначала инициализируйте этот объект в родительском классе:

@SerializedName("message")
@Expose
private Message message;

затем добавьте подкласс в POJO

class Message{

   @SerializedName("message")
   @Expose
   private String message;

    public String getMessage() {
      return message;
    }

    public void setMessage(String message) {
      this.message = message;
    }

}

ИЗМЕНИТЬ: ЗАГОЛОВОК

@Headers("Content-Type: application/json")
@POST("index.php")
Call<UserList>getUserDetails(@QueryMap Map<String,JSONObject> stringTaskMap);
17.05.2017
  • Я отправляю ожидаемый ответ, проверьте его, если это поможет : мужчина}], код: 200, сообщение: ГОТОВО} 17.05.2017
  • Вы тестировали ответ через почтальона или какую-то подобную программу, потому что вы явно получаете строку там, где ее быть не должно, и ваш POJO выглядит правильно? А также проверенные заголовки? 17.05.2017
  • да @tompadre Я проверил клиент REST API Chrome Postman, а также тот же объект запроса, используя залп Google 17.05.2017
  • А заголовки? И так как это php, проверьте этот ответ stackoverflow.com/a/43512374/5577679 17.05.2017
  • Заголовки из файла PHP header('Content-type: application/json; charset=utf-8'); 17.05.2017
  • поместите заголовок в интерфейс, как я сделал в своем редактировании в комментарии выше, хотя это далеко не так. 17.05.2017

  • 2

    Я думаю, что проблема не в вашем коде, просто проверьте журнал вашего сервера, какая строка json, которую ваш сервер отправляет вам, соответствует вашему текущему ожидаемому результату json

    Чтобы проверить вывод сервера, вы можете использовать postman или restclient - просто передайте свой URL, метод и параметр.

    во-вторых, я предлагаю вам использовать сериализуемый класс pojo, например

    public class UserList implements Serializable {
    
    }
    public class UserDatum implements Serializable {
    
    }
    

    Объект, отправляемый на сервер, должен иметь сериализуемый или разделяемый интерфейс

    Я использовал что-то вроде этого GsonConverterFactory.create()

    Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(ROOT)
                    .client(defaultHttpClient)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
    
    17.05.2017
  • Я попробовал вашу идею реализовать Serializable, но она не сработала, и да, прежде чем спрашивать в StackOverflow, я много пробовал. 17.05.2017
  • Это ожидаемая проверка ответа в коде, который я упомянул, что 17.05.2017
  • Кто управляет сервером, попросите этого человека отправить вам ответ сервера этого API и показать нам (вы показываете нам, что хотите, я спрашиваю вас, что вы получаете) 17.05.2017
  • Вам нужен PHP-код? или ответ JSON? Я сам работаю с сервером, чувак, и да, я скопировал ответ почтальона и упомянул его там как ожидаемый ответ. 17.05.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..