当前位置: 首页 > 知识库问答 >
问题:

Gson和Retrofit得到一个错误:预期BEGIN_ARRAY但BEGIN_OBJECT[重复]

淳于博
2023-03-14

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

通用域名格式。谷歌。格森。JsonSyntaxException:java。lang.IllegalStateException:应为BEGIN\u数组,但在第4行第14列path$处为BEGIN\u对象。数据

下面是我的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;
}

下面是ApiInterface

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"
}

}

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

共有2个答案

司徒经纶
2023-03-14

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类应该如下所示(字符串[]被数据类替换)

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;
}

}
施季
2023-03-14

响应(即响应

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

无需在此处使用gson builder:

 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
 类似资料:
  • 问题内容: 我在列表中仅收到一个项目时收到此错误。我在服务器端REST Web服务中使用Jersey,当List返回一个元素并且当我得到它时,我仅收到错误,但是当它包含多个元素时,它可以正常工作,这就是我的工作方式它: 为什么Jersey不发送包含一个项目的列表?这是球衣的虫子吗?有没有办法使它始终序列化为数组? 当Web服务返回0元素时,这是我的JSON数据: 当Web服务返回1元素时,这是我的

  • 我做了一个功能:输入身份证号码,点击提交按钮,然后获得身份证的基本信息。 我使用的模型是: 我使用的改装界面: 当我输入正确的身份证号码时,一切正常。返回的结果是: 一切运作良好。 然而,当我输入不正确的身份证号码时,不好的事情发生了: 返回的结果是: 我怎样才能修复这些漏洞?

  • 我的Retrofit2调用出现以下异常: 学分类别:

  • 我正在通过改型和RXAndroid与来自android的REST API进行交互,我遇到了一个问题。 当我向我的“api/users/{id}/{id}/classes”发送GET请求时,我的api会以用户类列表作出响应,如下所示: 我的界面如下所示: 我从片段中这样称呼它: 我的类对象以及getter和setter如下所示: gson不应该看到“类”:[]数组并从中解析对象吗?我做错了什么

  • 问题内容: 我正在尝试解析这样的JSON字符串 进入对象列表。 这是我正在使用的对象类。 但这让我着迷 有什么想法我应该如何解决? 问题答案: 问题是你要告诉你具有你类型的对象。你不知道 你有一系列类型的对象。你不能只是尝试像这样投射结果并期望它神奇地工作;) 《用户指南》介绍了如何处理此问题: https://github.com/google/gson/blob/master/UserGuid

  • 我将请求映射到类,如下所示: 有人能解释为什么我在请求中的数组没有与类A中的数组映射吗?