首页 > 解决方案 > 改造得到 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"
]
}

标签: androidapigsonretrofit2

解决方案


你需要使用

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

推荐阅读