2016-09-24 2 views
1

JSon ДАТаОжидаемое BEGIN_ARRAY но STRING дооснащения Android

[ 
    { 
    "date": "25-09-2016", 
    "_id": { 
     "$oid": "57e601bbf2a9d92a445ef8a3" 
    }, 
    "createdAt": "2016-09-24 10:01:55 +0530", 
    "horoscope": [ 
     { 
     "date": "25-09-2016", 
     "sunsign": "aries", 
     "horoscope": "Testing.." 
     }, 
     { 
     "date": "25-09-2016", 
     "sunsign": "taurus", 
     "horoscope": "Testing.." 
     }, 
     { 
     "date": "25-09-2016", 
     "sunsign": "pisces", 
     "horoscope": "Testing.." 
     } 
    ] 
    } 
] 

HoroscopeModel.java:

public class HoroscopeModel { 

    private Date date; 
    private Date createdAt; 
    private List<HoroscopeModel> horoscope; 

    public List<HoroscopeModel> getHoroscope() { 
     return horoscope; 
    } 

    public void setHoroscope(List<HoroscopeModel> horoscope) { 
     this.horoscope = horoscope; 
    } 


    public Date getDate() { 
     return date; 
    } 

    public void setDate(Date date) { 
     this.date = date; 
    } 

    public Date getCreatedAt() { 
     return createdAt; 
    } 

    public void setCreatedAt(Date createdAt) { 
     this.createdAt = createdAt; 
    } 

    public List<HoroscopeModel> getHoroscopeList() { 
     return horoscope; 
    } 

    public void setHoroscopeList(List<HoroscopeModel> horoscopeList) { 
     this.horoscope = horoscopeList; 
    } 
} 

Horoscope.java

public class Horoscope { 

    Date date; 
    String sunshine; 
    String horoscope; 

    public Date getDate() { 
     return date; 
    } 

    public void setDate(Date date) { 
     this.date = date; 
    } 

    public String getSunShine() { 
     return sunshine; 
    } 

    public void setSunShine(String sunShine) { 
     this.sunshine = sunShine; 
    } 

    public String getHoroscope() { 
     return horoscope; 
    } 

    public void setHoroscope(String horoscope) { 
     horoscope = horoscope; 
    } 
} 

ApiInterface.java

public interface ApiInterface { 

    @GET("/get_horoscope") 
    Call<List<HoroscopeModel>> getHoroscope(); 
} 

дооснащения:

private void setupRestClient() { 
    OkHttpClient.Builder client = new OkHttpClient.Builder(); 
    HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); 
    loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
    client.addInterceptor(loggingInterceptor); 


    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(API_URL) 
      .client(client.build()) 
      .addConverterFactory(GsonConverterFactory.create(getGson())) 
      .build(); 

    REST_CLIENT = retrofit.create(ApiInterface.class); 
} 

private Gson getGson() { 
    GsonBuilder builder = new GsonBuilder(); 
    builder.registerTypeAdapter(Date.class, new DateDeserializer()); 
    builder.setPrettyPrinting(); 
    return builder.create(); 
} 

DateDeserializer.java

public class DateDeserializer implements JsonDeserializer<Date> { 
    private static final String TAG = "DateDeserializer"; 
    private static final String[] DATE_FORMATS = new String[]{ 
      "yyy-MM-dd hh:mm:ss Z",//2016-09-24 08:18:56 +0530 
      "dd-MM-yyyy" 
    }; 

    @Override 
    public Date deserialize(JsonElement jsonElement, Type typeOF, 
          JsonDeserializationContext context) throws JsonParseException { 
     for (String format : DATE_FORMATS) { 
      try { 
       return new SimpleDateFormat(format, Locale.US).parse(jsonElement.getAsString()); 
      } catch (ParseException e) { 
      } 
     } 
     throw new JsonParseException("Unparseable date: \"" + jsonElement.getAsString() 
       + "\". Supported formats: " + Arrays.toString(DATE_FORMATS)); 
    } 
} 

Со всем прекрасно настроить это выдает ошибку, говоря java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 183 path $[0].horoscope[0].horoscope, пожалуйста, дайте мне знать, есть ли ошибка в моем коде. Заранее спасибо.

ответ

2

сообщение об ошибке самопонятны.

$[0].horoscope[0].horoscope - String, но вы пытаетесь десериализовать его в List.

Это потому, что в HoroscopeModel вы определяете horoscope как тип List<HoroscopeModel>, а не List<Horoscope>.

Gson пытается десериализации значение horoscope (а) String в horoscope области HoroscopeModel (а) List вместо horoscope области Horoscope (а) String.

В HoroscopeModel, изменение в следующем поле:

private List<HoroscopeModel> horoscope; 

к этому:

private List<Horoscope> horoscope; 

(и не забудьте изменить соответствующие методы также)

0

Gosn не конвертирует вашу строку в Date непосредственно, она запрашивает конкретный формат следующим образом.

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

Таким образом, вы должны использовать строки вместо даты, где используется следующим образом

public class Horoscope { 

    String date 

и

public class HoroscopeModel { 

    private String date; 
    private String createdAt; 
+0

Я надеюсь, что это не проблема, у меня уже есть DateDeserializer, прикрепленный к Gson, пожалуйста, посмотрите мой обновленный вопрос. –

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