android - 改造得到 org.json.JSONException:在字符 0 处输入结束
问题描述
我正在创建一个 android 应用程序,我需要从服务器调用 api 来检查状态。但我得到了org.json.JSONException: End of input at character 0 of
。我无法弄清楚出了什么问题。但如果我使用它volley
而不是retrofit
它正在工作。如果我正在使用retrofit
我会收到此错误。
活动
ApiInterface apiService =
ApiClient.getClient().create(ApiInterface.class);
HashMap<String, String> params = new HashMap<>();
params.put("rt", "fcf9e4cb63f014c309f3160d5d8b1b13");
Call<ResponseBody> mService = apiService.getData(params);
mService.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> API) {
if (API.isSuccessful()) {
try {
String data = API.body().string();
JSONObject object = new JSONObject(data);
status = object.getString("status");
Log.d("athira status:",status);
JSONArray array = object.getJSONArray("position");
for (int i = 0; i < array.length(); i++) {
val.add(array.getString(i));
}
} catch (JSONException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
adapter.notifyDataSetChanged();
rv.setAdapter(new RecyclerPredictionAdapter(gridViewArray, status, val, new RecyclerPredictionAdapter.OnItemClickListener() {
@Override
public void onItemClick(int position) {
GridViewClick(position);
}
}));
}
});
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
API
@POST(".")
Call<ResponseBody> getData(@Body HashMap<String, String> user);
错误
org.json.JSONException: End of input at character 0 of
2020-01-27 12:18:40.050 7014-7014/com.clickastro.dailyhoroscope W/System.err: at
org.json.JSONTokener.syntaxError(JSONTokener.java:449)
2020-01-27 12:18:40.050 7014-7014/com.clickastro.dailyhoroscope W/System.err: at
org.json.JSONTokener.nextValue(JSONTokener.java:97)
2020-01-27 12:18:40.050 7014-7014/com.clickastro.dailyhoroscope W/System.err: at
org.json.JSONObject.<init>(JSONObject.java:159)
2020-01-27 12:18:40.050 7014-7014/com.clickastro.dailyhoroscope W/System.err: at
org.json.JSONObject.<init>(JSONObject.java:176)
2020-01-27 12:18:40.050 7014-7014/com.clickastro.dailyhoroscope W/System.err: at
com.clickastro.dailyhoroscope.fragments.PredictionFragment$2.onResponse(PredictionFragment.java:265)
2020-01-27 12:18:40.050 7014-7014/com.clickastro.dailyhoroscope W/System.err: at
retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run
(ExecutorCallAdapterFactory.java:70)
2020-01-27 12:18:40.050 7014-7014/com.clickastro.dailyhoroscope W/System.err: at
android.os.Handler.handleCallback(Handler.java:873)
2020-01-27 12:18:40.050 7014-7014/com.clickastro.dailyhoroscope W/System.err: at
android.os.Handler.dispatchMessage(Handler.java:99)
结果
{
"status": "ON",
"position": [
"4"
]
}
解决方案
你需要使用
implementation "com.squareup.retrofit2:converter-gson:$retrofit2_version"
并创建对象
public class Example {
@SerializedName("status")
@Expose
private String status;
@SerializedName("position")
@Expose
private List<String> position = null;
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public List<String> getPosition() {
return position;
}
public void setPosition(List<String> position) {
this.position = position;
}
}
并使用这个
Call<Example> getData(@Body HashMap<String, String> user);
推荐阅读
- arduino-nano - Arduino 编译错误“___vector_11 的多重定义”
- python - 如何使用 numpy 减少 for 循环的使用?
- azure - Azure Maps - 看不到地图
- python - 如果另一个会话已经打开,SQLAlchemy .commit() 会成功但没有效果
- javascript - 显示重复的 HTML?
- sql - Oracle 12.2 中使用 BIND 变量和 OR 条件的 QUERY 性能问题
- z3 - 基于多个约束合成布尔表达式
- matplotlib - 如何避免 matplotlib 中的这种分裂回归曲线?
- python - 遍历执行多个计算并返回“True”或“False”的数据框行
- python - 如何计算 ARIMA 模型中的周期数