2015-09-30 50 views
9

我正在发送请求,但即使请求成功(我正在与之交互的API,在成功时发送OTP),我也会收到异常。如何在改造2中获取格式不正确的JSON

唯一的例外是:

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) 

现在我怎么会看到畸形的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; 
} 

接口:

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


    } 
} 

,这里是电话:

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

    }); 
+0

您好改造的β-2已经发布了有改装参数与响应一起,这将帮助你查看原始数据作为响应。 您的问题是从服务器发送的响应未采用有效格式。 你可以创建你自己的gsonConverter,传递你的适配器,并且你可以看到服务器把它转换为字符串的响应。 – subhash

+0

@subhash我添加了一个字符串转换器,因为我期待响应是一个字符串,但我仍然得到相同的错误。有任何想法吗? – Renier

回答

7

只需登录网络的反应,所以你会看到什么是错的。

@Override 
public Response intercept(Chain chain) throws IOException { 
    Response response = chain.proceed(chain.request()); 
    Log.w("[email protected]", response.body().string()); 
    return response; 
} 
+1

我会在哪里放这个?目前它在我的'getApiClient'方法中,但它没有记录任何东西(我怀疑它可能不会调用它)。我需要打电话吗?如果是这样的话? – Renier

+4

你必须使用'client'方法在'Retrofit.Builder'中设置'OkHttpClient'。 – dtx12

+0

谢谢你的帮助! :) – Renier

0

使用串转换器改造restadapter

RestAdapter adapterRfqPost = new RestAdapter.Builder() 
        .setEndpoint(Constants.ENDPOINT) 
        .setConverter(new ConstantsMethods.StringConverter()) 
        .build(); 

串转换器类

public static class StringConverter implements Converter { 
     @Override 
     public Object fromBody(TypedInput typedInput, Type type) throws ConversionException { 
      String text = null; 
      try { 
       text = fromStream(typedInput.in()); 
      } catch (IOException ignored) {/*NOP*/ } 
      return text; 
     } 

     @Override 
     public TypedOutput toBody(Object o) { 
      return null; 
     } 



public static String fromStream(InputStream in) throws IOException { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
     StringBuilder out = new StringBuilder(); 
     String newLine = System.getProperty("line.separator"); 
     String line; 
     while ((line = reader.readLine()) != null) { 
      out.append(line); 
      out.append(newLine);`enter code here` 
      }`enter code here` 
      return out.toString(); 
     } 
    }