2015-04-14 5 views
1

Недавно я решил использовать Retrofit Library для Android для выполнения сетевых вызовов, а также GSON для обработки JSON. Но я продолжаю получать следующее исключение, и мое приложение падает.Ошибка при обновлении JSONSyntaxException

Caused by: retrofit.RetrofitError: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 2 column 1 path $ 
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:383) 
at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240) 
at $Proxy0.getSMS(Native Method) 
at package$AsyncTask.doInBackground() 
Caused by: retrofit.converter.ConversionException: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 2 column 1 path $ 
at retrofit.converter.GsonConverter.fromBody(GsonConverter.java:67) 
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:367) 
... 10 more 
Caused by: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 2 column 1 path $ 
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:200) 
at com.google.gson.Gson.fromJson(Gson.java:810) 
at com.google.gson.Gson.fromJson(Gson.java:775) 
at retrofit.converter.GsonConverter.fromBody(GsonConverter.java:63) 
... 11 more 
Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 2 column 1 path $ 
at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:387) 
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:189) 
... 14 more 

Я почтальона для проверки JSON ответ, который

{"success":"true", 
"message":"We are going to rock you"} 

Мой интерфейс выглядит следующим образом:

public interface CreateHTTPRequest { 
public static final String END_POINT1 = "http://baseurl.com"; 

@POST("/user/usermob") 
public NewRes getSMS(@Query(value = "mobile") String mobile); 

// This is used as Model for return type 
public static class NewRes { 
    String success; 
    String message; 
} 

творю сети запрос в AsyncTask следующим образом:

 RestAdapter restAdapter = new RestAdapter.Builder() 
     .setEndpoint(CreateHTTPRequest.END_POINT1 /*"https://api.github.com"*/) 
     .build(); 

     CreateHTTPRequest request = restAdapter.create(CreateHTTPRequest.class); 
     NewRes response = request.getSMS("123456789"); 

Я не под что может быть неправильным. Я новичок в использовании Retrofit и GSON, поэтому не могу понять, что такое eveything.

+0

У вас есть решение? – maohieng

+0

Я использовал инструмент отладки от модернизации. Казалось, что json не был получен на сервере в ожидаемом формате. Это было задано с более ранней версией модификации 1.7-1.8, я думаю. Возможно, все изменилось, но я помню, что включение отладки в модификации помогло мне решить мою проблему. – Roadblock

ответ

0

Попробуйте использовать Дооснащаемый Обратный вызов для API вызова:

public interface CreateHTTPRequest { 
    public static final String END_POINT1 = "http://baseurl.com"; 

    @POST("/user/usermob") 
    void getSMS(@Query(value = "mobile") String mobile, Callback<NewRes> callback); 
} 

Вынимают NewRes и сделать его как новый класс:

public class NewRes { 
    String success; 
    String message; 
} 

Измените эту строку NewRes response = request.getSMS("123456789"); к:

final NewRes newRes; 
request.getSMS("123456789", new Callback<NewRes>() { 

    @Override 
    public void failure(RetrofitError error) { 
     //Do Something on Error 
    } 

    @Override 
    public void success(NewRes newResResponse, Response response) { 
     newRes=newResResponse; 
    } 
}); 

Надеюсь, это поможет, удачи!

Смежные вопросы