"Ожидается BEGIN_OBJECT, но в строке 2 столбца 1 путь $" при модификации "STRING" - PullRequest
0 голосов
/ 11 октября 2019

Я хочу отправить форму регистрации на сервер с модификацией. Сначала у меня появляется эта ошибка:

Используйте JsonReader.setLenient (true), чтобы принять искаженный JSON в строке 1, путь 1, столбец $.

Я пытаюсь это исправитьс добавлением Gson к Retrofit.Builder вот так:

 Gson gson = new GsonBuilder()
            .setLenient()
            .create();

    return new Retrofit.Builder()
            .baseUrl(AppConfig.BASE_URL)
            .addConverterFactory(GsonConverterFactory.create(gson))
            .build();

сейчас, у меня есть эта ошибка:

Ожидается BEGIN_OBJECT, нобыло STRING в строке 2 столбца 1 путь $

мой ответ сервера выглядит так:

{
"status": 1,
"message": "Successful"
}

как это исправить?

Обновление

мой интерфейс API:

public interface SignUpApi {

@Multipart
@POST("signup_profile")
Call<SignUpResponseModel> uploadFile(@Part MultipartBody.Part file,
                                     @Part("sample_disc") RequestBody imageFile,
                                     @Part("name") RequestBody name,
                                     @Part("phone") RequestBody phone,
                                     @Part("email") RequestBody email,
                                     @Part("password") RequestBody password,
                                     @Part("username") RequestBody username);

}

отправьте код информации и получите ответ:

RequestBody requestBody = RequestBody.create(MediaType.parse("*/*"), file);
        MultipartBody.Part fileToUpload = MultipartBody.Part.createFormData("file", file.getName(), requestBody);
        RequestBody filename = RequestBody.create(MediaType.parse("text/plain"), file.getName());
        RequestBody name = RequestBody.create(MediaType.parse("text/plain"), etName.getText().toString());
        RequestBody phone = RequestBody.create(MediaType.parse("text/plain"), etPhone.getText().toString());
        RequestBody email = RequestBody.create(MediaType.parse("text/plain"), etEmail.getText().toString());
        RequestBody password = RequestBody.create(MediaType.parse("text/plain"), etPass.getText().toString());
        RequestBody username = RequestBody.create(MediaType.parse("text/plain"), etUsername.getText().toString());

        SignUpApi getResponse = AppConfig.getRetrofit().create(SignUpApi.class);
        Call<SignUpResponseModel> call = getResponse.uploadFile(fileToUpload, filename, name, phone, email, password, username);
        call.enqueue(new Callback<SignUpResponseModel>() {
            @Override
            public void onResponse(Call<SignUpResponseModel> call, Response<SignUpResponseModel> response) {

                SignUpResponseModel signUpResponseModel = (SignUpResponseModel) response.body();
                if (signUpResponseModel != null) {
                    if (signUpResponseModel.getStatus() == 1) {
                        startActivity(new Intent(SignupActivity.this, LoginActivity.class));
                        ToastMessage.showToast(context, signUpResponseModel.getMessage());
                    } else {
                        btnSend.setText(signUpResponseModel.getMessage());
                    }
                } else {
                    assert signUpResponseModel != null;
                }
            }
            @Override
            public void onFailure(Call<SignUpResponseModel> call, Throwable t) {
                Log.i("error", t.getMessage());
            }
        });

SignUpResponseModel:

public class SignUpResponseModel {

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

public int getStatus() {
    return status;
}

public void setStatus(int status) {
    this.status = status;
}

public String getMessage() {
    return message;
}

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

}

ответ наPostMan:

введите описание изображения здесь

Ответы [ 4 ]

1 голос
/ 11 октября 2019

Я думаю, что вы ошиблись JSON response, когда вы вызываете свой API с устройства. Это может быть проблемой на вашем сервере. Скажем, когда вы вызываете свой API с помощью почтальона, вы получаете ожидаемый ответ, как показано ниже (потому что ваш вызов API в порядке)

{
"status": 1,
"message": "Successful"
}

А когда вы вызываете API из своего приложения, вы получаете неправильный ответ JSON response с сервера означает, что вызов API не в порядке [его можно удовлетворить по многим причинам].

"{
"status": 0,
"message": ""
}"

Таким образом, вы получите исключение, что вы ожидаете объект в ответ, но получаетестрока.

Вы можете получить ответ от API и преобразовать его в строку, используя ResponseBody из okhttp, например:

Call<ResponseBody> call = getResponse.uploadFile(fileToUpload, filename, name, phone, email, password, username);
call.enqueue(new Callback<ResponseBody>() {
     @Override
     public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
             try {
                // here you can what response you are getting.
                Log.d("JSON From Server", response.body().string());//convert reponse to string
             } catch (IOException e) {
                e.printStackTrace();
             }
      }
      @Override
      public void onFailure(Call<ResponseBody> call, Throwable t) {
          Log.i("error", t.getMessage());
      }
  });

А также использовать ResponseBody в своем APIконечная точка, как показано ниже

Call<ResponseBody> uploadFile.....
0 голосов
/ 11 октября 2019

{"status": 1, "message": "Successful"} Ожидается BEGIN_OBJECT, но в строке 1 пути 1 столбца $ STRING $

четко говорит, что в вашем ответе значение сообщения является строковым типомно ожидается, что это объект JSON. поэтому вместо «успешно» это может быть объект JSON.

0 голосов
/ 11 октября 2019

В своем ответе вы получаете ответ в виде строки, но для него требуется объект json, например

"{
 "status": 1,
 "message": "Successful"
 }" -- you are getting this 

 but you required -  {
 "status": 1,
 "message": "Successful"
 }
0 голосов
/ 11 октября 2019

вы получаете статус, а в ответном сообщении указывается, что переменная, заданная в URL, может быть конфликтующей.

...