2015-06-16 4 views
3

В api response иногда Это может быть массив, иногда это может быть строка.Ошибка при модернизации: ожидается BEGIN_ARRAY, но было STRING

Здесь детали является массив

{ "ts": "2015-06-16 11:28:33","success": true,"error": false,"details": [ 
{ 
    "user_id": "563", 
    "firstname": "K.Mathan" 
}, 
{ 
    "user_id": "566", 
    "firstname": "Surya" 
}, 
{ 
    "user_id": "562", 
    "firstname": "Idaya" 
} ]} 

Иногда детали могут быть строкой

{ "ts": "2015-06-16 11:28:33", 
"success": true, 
"error": false, 
"details": "no data" } 

Здесь подробно струнный

Как получить значение из этого типа ответа

Моя текущая декларация

@SerializedName(value="details") 
    public List<detailslist> details ; 

Любой, пожалуйста, помогите мне найти решение?

+4

сказать бэкэнд ребята отправить пустой массив, не произвольная строка. Для * согласованности * причин – Blackbelt

+0

Не спускайте, это действительный и законный вопрос – eduyayo

+0

Но мы используем этот вид ответа для IOS, они могут получить значение. Используя только модифицировать, я не могу получить значение –

ответ

4

Пробовал ли вы тип сырого ответа?

@GET("your_url") 
void getDetails(Callback<Response> cb); 

Затем вы можете разобрать ответ, используя JSONObject и JSONArray так:

Callback<Response> callback = new Callback<Response>() { 
     @Override 
     public void success(Response detailsResponse, Response response2) { 

     String detailsString = getStringFromRetrofitResponse(detailsResponse); 

     try { 
      JSONObject object = new JSONObject(detailsString); 

      //In here you can check if the "details" key returns a JSONArray or a String 

     } catch (JSONException e) { 

     } 

    } 

    @Override 
    public void failure(RetrofitError error) { 

    }); 

Где getStringFromRetrofitRespone может быть:

public static String getStringFromRetrofitResponse(Response response) { 
    //Try to get response body 
    BufferedReader reader = null; 
    StringBuilder sb = new StringBuilder(); 
    try { 

     reader = new BufferedReader(new InputStreamReader(response.getBody().in())); 

     String line; 

     try { 
      while ((line = reader.readLine()) != null) { 
       sb.append(line); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    return sb.toString(); 

} 
+0

Привет, Он работает Спасибо большое :) –

+0

Привет, могу ли я использовать? - новый обратный вызов () { @Override public void success (JSONObject jsonObj, Response response) { –

0

Я думаю, вы можете написать свой собственный десериализатор для использования в модификации, но он также работает, просто вызывая, что это объект, а затем обрабатывает его позже в вашем коде.

@SerializedName(value="details") 
public Object details; 
+0

Я пробовал, но я получил ошибку «несколько полей JSON с именами деталей» –

+0

@MathankumarK, обновил ответ сейчас. – korrekorre

+0

Это работает Спасибо @korrekorre –

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