2015-09-30 27 views
9

İstek gönderiyorum, ancak istek başarılı olsa bile bir istisna alıyorum (Etkileşim kurduğum API, başarıya OTP gönderir).Retrofit 2'de hatalı biçimlendirilmiş JSON nasıl edinilir

istisnadır: Şimdi hatalı biçimlendirilmiş JSON olduğunu nasıl göreceğini

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 nesnesinin hatalı oluşturulup oluşturulmadığını öğrenmek için, eğer iade edilen nesne ise (ki bu bir dizge olmasını bekliyorum) veya gönderdiğim nesnedir.

Bu önemsiz bir soru olursa beni affet, bu hafta itibariyle yalnızca Android geliştirmeyle başladım.

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

Arabirim: Sorunun ne göreceksiniz böylece

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

Merhaba yanıtı ile birlikte güçlendirme parametresi vardır beta-2 yayımladı güçlendirme size hangi yardımcı olacaktır ham verileri yanıt olarak görüntüle. Sorununuz, sunucudan gönderilen yanıt geçerli bir biçimde değil. Kendi gsonConverter'ınızı oluşturabilir, bağdaştırıcınızın içine girebilir ve içeride sunucuyu dizgeden dönüştürerek yanıtı görebilirsiniz. – subhash

+0

@subhash Bir dize dönüştürücü ekledim, çünkü yanıtın bir dize olmasını bekliyorum, ancak yine de aynı hatayı alıyorum. herhangi bir fikir? – Renier

cevap

7

Sadece, ağ yanıtları log: Burada

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


    } 
} 

ve çağrıdır Burada

hizmetidir .

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

Bunu nereye koyayım? şu anda 'getApiClient' yöntemimde, fakat hiçbir şey kaydetmiyor (bunu çağıramayacağından şüpheleniyorum). Onu aramam lazım mı? eğer öyleyse nerede? – Renier

+4

'OkHttpClient'in' client' yöntemini kullanarak 'Retrofit.Builder' içinde ayarlamanız gerekmektedir. – dtx12

+0

Yardımlarınız için teşekkür ederiz! :) – Renier

0

Kullanım dize çevirici Güçlendirme için

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

dize çevirici sınıfının restadapter

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