预计改造 BEGIN_OBJECT 但为 STRING
Retrofit Expected BEGIN_OBJECT but was STRING
大家好,我是 Sqareup 改造库的新手。我使用 Laravel 框架创建了一个网络服务。当我给出错误或格式错误的 phone 数字时,它应该给我一个正确的错误 json。
我正在尝试解析此 JSON 响应:
{
"message": "The given data was invalid.",
"errors": {
"mobile_number": [
"The mobile number format is invalid.",
"The mobile number must be 11 digits."
]
}
}
这是我的模型class:
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import java.util.List;
public class LoginResult {
@SerializedName("mobile_number")
private String mobileNumber;
private String action;
@SerializedName("message")
private String message;
@SerializedName("errors")
private Errors errors;
public String getMobileNumber() {
return mobileNumber;
}
public String getAction() {
return action;
}
public String getMessage() {
return message;
}
public Errors getErrors() {
return errors;
}
public static class Errors {
@SerializedName("mobile_number")
@Expose
private List<String> mobileNumber = null;
public List<String> getMobileNumber() {
return mobileNumber;
}
}
}
...
import com.google.gson.annotations.SerializedName;
public class Login {
@SerializedName("mobile_number")
private String mobileNumber;
public String getMobileNumber() {
return mobileNumber;
}
public Login(String mobileNumber) {
this.mobileNumber = mobileNumber;
}
}
我的界面:
import ir.husoft.kasbokar.models.Login;
import ir.husoft.kasbokar.models.LoginResult;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.POST;
public interface ApiInterface {
@POST("api/auth/login")
Call<LoginResult> login(@Body Login login);
}
这是 ApiClient:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class ApiClient {
public static final String BASE_URL = "http://127.0.0.1:8000/";
public static Retrofit retrofit;
public static Retrofit getApiClient() {
if (retrofit == null) {
Gson gson = new GsonBuilder().setLenient().create();
retrofit = new Retrofit.Builder().baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson)).build();
}
return retrofit;
}
}
我的成功方法:
ApiInterface api = ApiClient.getApiClient().create(ApiInterface.class);
String mobileNumber = etMobileNumber.getText().toString();
Login login = new Login(mobileNumber);
Call<LoginResult> verification = api.login(login);
verification.enqueue(new Callback<LoginResult>() {
@Override
public void onResponse(Call<LoginResult> call, Response<LoginResult> response) {
if (response.isSuccessful()) {
Toast.makeText(LoginActivity.this, "Action is: " + response.body().getMessage(), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(LoginActivity.this, "Error code: " + response.code(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<LoginResult> call, Throwable throwable) {
Toast.makeText(LoginActivity.this, throwable.getLocalizedMessage(), Toast.LENGTH_LONG).show();
}
});
当我在我的成功方法中使用它时,它会抛出错误
Expected BEGIN_OBJECT but was STRING at line 1 column 1
这里有什么问题?
您是否尝试从 LoginResult
中删除 private String mobileNumber
并且 mobileNumber
是一个数组或字符串列表。
我发现了问题。我忘记为请求设置 Headers。 ApiInterface 必须如下所示:
public interface ApiInterface {
@Headers("Accept: application/json")
@POST("api/auth/login")
Call<LoginResult> login(@Body Login login);
}
尝试使用此代码注册您的数据类型,其中 GSON 无法转换在我的情况下它是一个 Instant 数据类型,它是我模型中的 CreatedDate 字段 class。
Gson gson = new GsonBuilder().registerTypeAdapter(Instant.class, new JsonDeserializer<Instant>() {
@Override
public Instant deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
return Instant.parse(json.getAsString());
}
}).create();
retrofitClient = new Retrofit.Builder()
.baseUrl(Config.BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(retroHttpClient)
.build();
大家好,我是 Sqareup 改造库的新手。我使用 Laravel 框架创建了一个网络服务。当我给出错误或格式错误的 phone 数字时,它应该给我一个正确的错误 json。 我正在尝试解析此 JSON 响应:
{
"message": "The given data was invalid.",
"errors": {
"mobile_number": [
"The mobile number format is invalid.",
"The mobile number must be 11 digits."
]
}
}
这是我的模型class:
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import java.util.List;
public class LoginResult {
@SerializedName("mobile_number")
private String mobileNumber;
private String action;
@SerializedName("message")
private String message;
@SerializedName("errors")
private Errors errors;
public String getMobileNumber() {
return mobileNumber;
}
public String getAction() {
return action;
}
public String getMessage() {
return message;
}
public Errors getErrors() {
return errors;
}
public static class Errors {
@SerializedName("mobile_number")
@Expose
private List<String> mobileNumber = null;
public List<String> getMobileNumber() {
return mobileNumber;
}
}
}
...
import com.google.gson.annotations.SerializedName;
public class Login {
@SerializedName("mobile_number")
private String mobileNumber;
public String getMobileNumber() {
return mobileNumber;
}
public Login(String mobileNumber) {
this.mobileNumber = mobileNumber;
}
}
我的界面:
import ir.husoft.kasbokar.models.Login;
import ir.husoft.kasbokar.models.LoginResult;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.POST;
public interface ApiInterface {
@POST("api/auth/login")
Call<LoginResult> login(@Body Login login);
}
这是 ApiClient:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class ApiClient {
public static final String BASE_URL = "http://127.0.0.1:8000/";
public static Retrofit retrofit;
public static Retrofit getApiClient() {
if (retrofit == null) {
Gson gson = new GsonBuilder().setLenient().create();
retrofit = new Retrofit.Builder().baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson)).build();
}
return retrofit;
}
}
我的成功方法:
ApiInterface api = ApiClient.getApiClient().create(ApiInterface.class);
String mobileNumber = etMobileNumber.getText().toString();
Login login = new Login(mobileNumber);
Call<LoginResult> verification = api.login(login);
verification.enqueue(new Callback<LoginResult>() {
@Override
public void onResponse(Call<LoginResult> call, Response<LoginResult> response) {
if (response.isSuccessful()) {
Toast.makeText(LoginActivity.this, "Action is: " + response.body().getMessage(), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(LoginActivity.this, "Error code: " + response.code(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<LoginResult> call, Throwable throwable) {
Toast.makeText(LoginActivity.this, throwable.getLocalizedMessage(), Toast.LENGTH_LONG).show();
}
});
当我在我的成功方法中使用它时,它会抛出错误
Expected BEGIN_OBJECT but was STRING at line 1 column 1
这里有什么问题?
您是否尝试从 LoginResult
中删除 private String mobileNumber
并且 mobileNumber
是一个数组或字符串列表。
我发现了问题。我忘记为请求设置 Headers。 ApiInterface 必须如下所示:
public interface ApiInterface {
@Headers("Accept: application/json")
@POST("api/auth/login")
Call<LoginResult> login(@Body Login login);
}
尝试使用此代码注册您的数据类型,其中 GSON 无法转换在我的情况下它是一个 Instant 数据类型,它是我模型中的 CreatedDate 字段 class。
Gson gson = new GsonBuilder().registerTypeAdapter(Instant.class, new JsonDeserializer<Instant>() {
@Override
public Instant deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
return Instant.parse(json.getAsString());
}
}).create();
retrofitClient = new Retrofit.Builder()
.baseUrl(Config.BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(retroHttpClient)
.build();