2016-09-24 229 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

的錯誤消息是相當不言自明的到位日期用String任何地方使用。

$[0].horoscope[0].horoscopeString,但您試圖將其反序列化爲List

這是因爲在HoroscopeModel中,您將horoscope定義爲List<HoroscopeModel>而不是List<Horoscope>

GSON試圖的horoscope的值(一個String)反序列化爲的HoroscopeModelhoroscope字段(List)代替的Horoscopehoroscope字段(一個String)。

HoroscopeModel,更改爲以下領域:

private List<HoroscopeModel> horoscope; 

要這樣:

private List<Horoscope> horoscope; 

(不要忘記修改相應的方法也)

0

Gosn不會直接將字符串轉換爲日期,它會按照以下方式定義特定的格式。

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,請看看我更新的問題。 –

相關問題