可用的:
- 安卓应用
- ASP.NET 上的 Web API
我创建一个对象Retrofit
:
Retrofit service = new Retrofit.Builder()
.baseUrl("http://192.168.0.3/") // адрес WebApi
.addConverterFactory(GsonConverterFactory.create())
.build();
在我调用我需要的 API 方法的代码中,数据正确地到达了 API。作为测试,我返回控制器中的模型json
行动
[HttpPost]
public JsonResult GetUser(UserModel model)
{
return Json(JsonConvert.SerializeObject(model));
}
模型
public class UserModel
{
[JsonProperty("id")]
public int Id { get; set; }
[JsonProperty("email")]
public string Email { get; set; }
[JsonProperty("password")]
public string Password { get; set; }
[JsonProperty("name")]
public string name { get; set; }
[JsonProperty("device_id")]
public string DeviceId { get; set; }
[JsonProperty("register_date")]
public string RegisterDate { get; set; }
[JsonProperty("updated_date")]
public string UpdatedDate { get; set; }
}
通过 POSTMAN 我得到了正确的json
.
但是,在 Android 中我得到Exception
:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224)
at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:37)
at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:25)
at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:117)
at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:211)
at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:106)
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:133)
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:213)
... 10 more
json
为什么API自带的在 Android 上没有解析?
更新
API 响应:
{\"id\":1,\"email\":\"myemail@gmail.com\",\"password\":\"1234\",\"name\":null,\"device_id\":null,\"register_date\":null,\"updated_date\":null}
在 Android 中,在回调处理程序中,我掉在这里:
@Override
public void onFailure(Call<UserModel> call, Throwable t) {
t.printStackTrace();
}
根据这个验证器,服务器响应中的无效 JSON 是额外的转义斜杠。他们在这里描述了一个类似的问题并建议删除转义斜杠