如何在Retrofit 2中获取格式错误的JSON

Ren*_*ier 11 android json retrofit

我正在发送请求,但即使请求成功(我正在与之交互的API,成功发送OTP),我也会收到异常.

例外是:

com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 2 path $
            at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1573)
            at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1423)
            at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:575)
            at com.google.gson.stream.JsonReader.peek(JsonReader.java:429)
            at com.google.gson.internal.bind.TypeAdapters$13.read(TypeAdapters.java:349)
            at com.google.gson.internal.bind.TypeAdapters$13.read(TypeAdapters.java:346)
            at com.google.gson.TypeAdapter.fromJson(TypeAdapter.java:256)
            at retrofit.GsonConverter.fromBody(GsonConverter.java:42)
            at retrofit.OkHttpCall.parseResponse(OkHttpCall.java:144)
            at retrofit.OkHttpCall.access$000(OkHttpCall.java:25)
            at retrofit.OkHttpCall$1.onResponse(OkHttpCall.java:90)
            at com.squareup.okhttp.Call$AsyncCall.execute(Call.java:168)
            at com.squareup.okhttp.internal.NamedRunnable.run(NamedRunnable.java:33)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
            at java.lang.Thread.run(Thread.java:856)
Run Code Online (Sandbox Code Playgroud)

现在,我怎么会看到格式错误的JSON?为了知道是什么Json对象格式错误,如果它是被返回的对象(我期望它是一个字符串),或者它是我发送的对象.

请原谅我,如果这是一个微不足道的问题,我本周才开始使用Android开发.

这是服务:

public static EnrollmentApiInterface getApiClient(){
    if (EnrollmentRequest == null) {
        OkHttpClient client = new OkHttpClient();
        client.interceptors().add(new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Response response = chain.proceed(chain.request());

                Request request = chain.request();
                Buffer buffer = new Buffer();
                request.body().writeTo(buffer);
                String body = buffer.readUtf8();
                Log.println(10, TAG, body);
                Log.i(TAG, "hello:        " + response);

                String bodyString = response.body().string();
                Log.i(TAG, bodyString);
                response = response.newBuilder()
                    .body(ResponseBody.create(response.body().contentType(), bodyString))
                    .build();
                return response;
            }
        });

        Gson gson = new GsonBuilder()
            .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
            .create();

        Retrofit retrofit = new Retrofit.Builder()
            // .baseUrl("http://10.0.2.2:6543/") // On AVD
            .baseUrl("http://192.168.0.106:6543") // On device
            .addConverterFactory(GsonConverterFactory.create(gson))
            .build();

        EnrollmentRequest = retrofit.create(EnrollmentApiInterface.class);
    }
    return EnrollmentRequest;
}
Run Code Online (Sandbox Code Playgroud)

接口:

public interface EnrollmentApiInterface {

        @Headers({
            "Accept: application/json",
            "Content-Type: application/json"
        })
        @POST("auth/enroll")
        Call<String> RequestEnrollment(@Body JsonObject EnrollmentDetails);

        @Headers({
            "Accept: application/json",
            "Content-Type: application/json"
        })
        @POST("auth/enroll/auth")
        Call<String> AuthoriseEnrollment(@Body JsonObject LoginDetails);


    }
}
Run Code Online (Sandbox Code Playgroud)

这是电话:

EnrollmentRequest request = new EnrollmentRequest();
    request.setMsisdn(MsisdnTxt.getText().toString());
    request.setId_number(IdNumberTxt.getText().toString());
    EnrollmentApiClient.EnrollmentApiInterface service = EnrollmentApiClient.getApiClient();
    Log.i(TAG, "REQUEST:   " + request.toJson());
    Call<String> call = service.RequestEnrollment(request.toJson());
    call.enqueue(new Callback<String>() {
        @Override
        public void onResponse(Response<String> response) {
            Log.i(TAG, "ON RESPONSE" + response);
            Log.i(TAG, "ON RESPONSE BODY" + response.body());
            // Create object of SharedPreferences.
            SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(that);
            //now get Editor
            SharedPreferences.Editor editor = sharedPref.edit();
            //put your value
            editor.putString("IDnumber", IdNumberTxt.getText().toString());
            editor.putString("Msisdn", MsisdnTxt.getText().toString());

            //commits your edits
            editor.commit();
            Log.i(TAG, "onClick-AFTER");
            Intent intent = new Intent(getApplicationContext(), AuthoriseActivity.class);
            startActivity(intent);

        }

        @Override
        public void onFailure(Throwable t) {
            // It always comes in here
            Log.i(TAG, "NOTHERE", t);
            Log.d("CallBack", " Throwable is " + t.toString());

            Toast.makeText(EnrollActivity.this, "Request Failed", Toast.LENGTH_LONG).show();
        }

    });
Run Code Online (Sandbox Code Playgroud)

dtx*_*x12 9

只需记录您的网络响应,这样您就会发现错误.

@Override
public Response intercept(Chain chain) throws IOException {
    Response response = chain.proceed(chain.request());
    Log.w("Retrofit@Response", response.body().string());
    return response;
}
Run Code Online (Sandbox Code Playgroud)

  • 你必须使用`client`方法在`Retrofit.Builder`中设置`OkHttpClient`. (4认同)