改造中的“预期为BEGIN_OBJECT,但在第2行第1列路径$处为STRING”

时间:2019-10-11 06:46:55

标签: android retrofit

我想将注册表单发送给服务器进行翻新。首先我有这个错误:

  

使用JsonReader.setLenient(true)在第1行第1列路径$处接受格式错误的JSON。

我正在尝试通过向 Retrofit.Builder 中添加 Gson 来修复该问题,

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

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

现在,我遇到此错误:

  

预期为BEGIN_OBJECT,但位于第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的答复:

enter image description here

4 个答案:

答案 0 :(得分:1)

我认为您从设备调用API时遇到了错误的JSON response。这可能是服务器中的问题。假设当您使用邮递员调用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());
      }
  });

并在如下所示的API端点中使用ResponseBody

Call<ResponseBody> uploadFile.....

答案 1 :(得分:0)

您正在获取状态,并且消息响应显示url中设置的变量可能有冲突。我的意思是

@Part("sample_disc") RequestBody imageFile,
                                     @Part("name") RequestBody name,// May be these variable name are not exact 
                                     @Part("phone") RequestBody phone,
                                     @Part("email") RequestBody email,
                                     @Part("password") RequestBody password,
                                     @Part("username") RequestBody username);

答案 2 :(得分:0)

{ “状态”:1, ” 消息”:“成功” } 预期为BEGIN_OBJECT,但位于第2行第1列路径$

清楚地说,消息的响应值是字符串类型,但应该是JSON对象。 因此它可能不是JSON对象,而是“成功”。

答案 3 :(得分:0)

在您的响应中,您以字符串形式获取响应,但其需要json对象 例如

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

 but you required -  {
 "status": 1,
 "message": "Successful"
 }