Gson 和 Retrofit 收到一个错误:预期BEGIN_ARRAY但已BEGIN_OBJECT



我是使用Retrofit和Gson的新手,当我尝试使用POST方法向REST API发送请求时,我遇到了以下错误。

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: 预期BEGIN_ARRAY,但在第 4 行第 14 列路径 $.data BEGIN_OBJECT

下面是我的 java 代码。

private void sendRequest(CheckEmail checkEmail){
    ApiInterface apiService =  ApiClient.getClient().create(ApiInterface.class);
    Call<CheckEmail> call = apiService.getEmailStatus(checkEmail);
    call.enqueue(new Callback<CheckEmail>() {
        @Override
        public void onResponse(Call<CheckEmail> call, Response<CheckEmail> response) {
            GsonBuilder gsonBuilder = new GsonBuilder();
            Gson gson = gsonBuilder.create();
            CheckEmail checkEmail = gson.fromJson(String.valueOf(response.body().getData()), CheckEmail.class);
            Toast.makeText(CheckEmailPage.this, "Successfull "+checkEmail, Toast.LENGTH_SHORT).show();
        }
        @Override
        public void onFailure(Call<CheckEmail> call, Throwable t) {
            Toast.makeText(CheckEmailPage.this, "Something went wrong!", Toast.LENGTH_SHORT).show();
            Log.e("Error Retrofit : ", String.valueOf(t));
        }
    });
}

下面是我的模型

public class CheckEmail {
private int code;
private String message;
private String[] data;
public CheckEmail(String message) {
    this.message = message;
}
public int getCode() {
    return code;
}
public void setCode(int code) {
    this.code = code;
}
public String getMessage() {
    return message;
}
public void setMessage(String message) {
    this.message = message;
}
public String[] getData() {
    return data;
}
public void setData(String[] data) {
    this.data = data;
}
}

这是我初始化 URL 和改造构建器的类

public class ApiClient {
public static final String BASE_URL = "https://f49d9d29-8471-4126-95b0-1ec3d18eda94.mock.pstmn.io/v1/";
private static Retrofit retrofit;
public static Retrofit getClient(){
    HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
    logging.setLevel(HttpLoggingInterceptor.Level.BODY);
    OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
    httpClient.addInterceptor(logging);
    if(retrofit == null){
        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
    return retrofit;
}

下面是接口

public interface ApiInterface {
@POST("users/check_status")
Call<CheckEmail> getEmailStatus(@Body CheckEmail email);
}

这是我的 JSON 回应,我被邮递员击中了

{
"code": 1000,
"message": "OK",
"data": {
    "id": "1",
    "email": "test.test@gmail.com",
    "status": "1",
    "name": "testing",
    "category": "2"
}

}

我的代码有什么问题?提前致谢

响应(即响应<>响应(已经解析。 无需使用 gson builder 再次解析它。 只需从响应中获取数据,如下所示:

String data[] = response.body().getData();

这里不需要使用 gson 生成器:

 GsonBuilder gsonBuilder = new GsonBuilder(); // remove this code
            Gson gson = gsonBuilder.create();// remove this code
CheckEmail checkEmail = gson.fromJson(String.valueOf(response.body().getData()), CheckEmail.class);// remove this code

checkEmail 类中的数据不是字符串数组。

改为将数据替换为以下类。

public class Data {
@SerializedName("id")
@Expose
private String id;
@SerializedName("email")
@Expose
private String email;
@SerializedName("status")
@Expose
private String status;
@SerializedName("name")
@Expose
private String name;
@SerializedName("category")
@Expose
private String category;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
}

你的 checkEmail 类应该是如下所示的(String[] 被 Data 类替换(

public class CheckEmail{
@SerializedName("code")
@Expose
private Integer code;
@SerializedName("message")
@Expose
private String message;
@SerializedName("data")
@Expose
private Data data;
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 Data getData() {
return data;
}
public void setData(Data data) {
this.data = data;
}
}

相关内容

最新更新