2017-10-21 500 views
1

我試圖反序列化類型如何使用GSON

ArrayList<Pair<OuterData, ArrayList<InnerData>>>

的對象序列化的對ArrayList的地方OuterDataInnerData使用GSON的POJO。

我已經盡力了,但我無法做到。我越來越

java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap 不能轉換到 v2015.oasis.pilani.bits.com.home.events.inner.InnerData

每當我試圖用做new Gson().fromJson(json, type);

,其中從TypeToken獲得式

new TypeToken<ArrayList<Pair<OuterData, ArrayList<InnerData>>>>(){}.getType() 

我雖然使用類型將解決我的問題,因爲最初我不想使用它,但它沒有。任何幫助表示讚賞。

編輯:這裏是OuterDataInnerData類(在科特林)

data class InnerData(val name: String, 
        val category: String, 
        val categoryIcon: Int, 
        val description: String, 
        val rules: String, 
        val time: String, 
        val date: String, 
        val venue: String, 
        val notifyState: Boolean, 
        val notifyTime: Int, 
        val favouriteState: Boolean) 

data class OuterData(val heading: String, val color: Int) 

我使用GSON只序列化的數據。所以反序列化使用的是使用gson序列化的相同的json。

EDIT2:序列化JSON數據:這是使用GSON

[ 
{ 
    "first": { 
     "color": -65281, 
     "heading": "October 01" 
    }, 
    "second": [ 
     { 
      "category": "", 
      "categoryIcon": 17301533, 
      "date": "", 
      "description": "sfd", 
      "favouriteState": false, 
      "name": "sdfds", 
      "notifyState": false, 
      "notifyTime": 0, 
      "rules": "", 
      "time": "", 
      "venue": "" 
     } 
    ] 
}, 
{ 
    "first": { 
     "color": -65281, 
     "heading": "November 01" 
    }, 
    "second": [ 
     { 
      "category": "", 
      "categoryIcon": 17301533, 
      "date": "djfkd", 
      "description": "klddjflk", 
      "favouriteState": false, 
      "name": "jkl", 
      "notifyState": false, 
      "notifyTime": 0, 
      "rules": "", 
      "time": "sdkjfk", 
      "venue": "ldkfjf" 
     } 
    ] 
}, 
{ 
    "first": { 
     "color": -16175867, 
     "heading": "October 31" 
    }, 
    "second": [ 
     { 
      "category": "Event Category", 
      "categoryIcon": 17301533, 
      "date": "31-10-2017", 
      "description": "Event Description", 
      "favouriteState": false, 
      "name": "Event name", 
      "notifyState": false, 
      "notifyTime": 0, 
      "rules": "Events Rules", 
      "time": "13:55", 
      "venue": "Event Venue" 
     }, 
     { 
      "category": "", 
      "categoryIcon": 17301533, 
      "date": "", 
      "description": "", 
      "favouriteState": false, 
      "name": "dsf", 
      "notifyState": false, 
      "notifyTime": 0, 
      "rules": "", 
      "time": "", 
      "venue": "" 
     }, 
     { 
      "category": "", 
      "categoryIcon": 17301533, 
      "date": "", 
      "description": "", 
      "favouriteState": false, 
      "name": "", 
      "notifyState": false, 
      "notifyTime": 0, 
      "rules": "", 
      "time": "", 
      "venue": "" 
     }, 
     { 
      "category": "", 
      "categoryIcon": 17301533, 
      "date": "", 
      "description": "", 
      "favouriteState": false, 
      "name": "", 
      "notifyState": false, 
      "notifyTime": 0, 
      "rules": "", 
      "time": "", 
      "venue": "" 
     }, 
     { 
      "category": "", 
      "categoryIcon": 17301533, 
      "date": "", 
      "description": "", 
      "favouriteState": false, 
      "name": "", 
      "notifyState": false, 
      "notifyTime": 0, 
      "rules": "", 
      "time": "", 
      "venue": "" 
     }, 
     { 
      "category": "", 
      "categoryIcon": 17301533, 
      "date": "", 
      "description": "", 
      "favouriteState": false, 
      "name": "", 
      "notifyState": false, 
      "notifyTime": 0, 
      "rules": "", 
      "time": "", 
      "venue": "" 
     }, 
     { 
      "category": "", 
      "categoryIcon": 17301533, 
      "date": "", 
      "description": "", 
      "favouriteState": false, 
      "name": "", 
      "notifyState": false, 
      "notifyTime": 0, 
      "rules": "", 
      "time": "", 
      "venue": "" 
     }, 
     { 
      "category": "", 
      "categoryIcon": 17301533, 
      "date": "", 
      "description": "", 
      "favouriteState": false, 
      "name": "", 
      "notifyState": false, 
      "notifyTime": 0, 
      "rules": "", 
      "time": "", 
      "venue": "" 
     }, 
     { 
      "category": "", 
      "categoryIcon": 17301533, 
      "date": "", 
      "description": "", 
      "favouriteState": false, 
      "name": "", 
      "notifyState": false, 
      "notifyTime": 0, 
      "rules": "", 
      "time": "", 
      "venue": "" 
     } 
    ] 
}] 
+0

你可以發佈一些示例JSON和你使用的類嗎? – 2017-10-21 09:33:00

+0

我編輯了這個問題。請看一看。 –

+0

你可以請張貼一些JSON嗎? – Ellisan

回答

0

我知道了。問題是我正在使用kotlin的Pair類。只要我定義了我自己的簡單Pair類,一切都正確無誤。

0

我想你的代碼的輸出序列化和它的作品:

import com.google.common.base.Charsets; 
import com.google.common.io.Resources; 
import com.google.gson.Gson; 
import com.google.gson.reflect.TypeToken; 
import java.lang.reflect.Type; 
import java.util.List; 

public class App { 
    public static void main(String[] args) throws Exception { 
     Gson gson = new Gson(); 
     final Type type = new TypeToken<List<Pair<OuterData, List<InnerData>>>>() {}.getType(); 
     final List<Pair<OuterData, List<InnerData>>> o = new Gson().fromJson(Resources.toString(Resources.getResource("foo.json"), Charsets.UTF_8), type); 
     System.out.println(gson.toJson(o)); 
     System.out.println(o.get(0).getFirst().getColor()); 
    } 

    static class Pair<F, S> { 
     F first; 
     S second; 

     public F getFirst() { 
      return first; 
     } 

     public void setFirst(F first) { 
      this.first = first; 
     } 

     public S getSecond() { 
      return second; 
     } 

     public void setSecond(S second) { 
      this.second = second; 
     } 
    } 

    static class OuterData { 
     String heading; 
     Integer color; 

     public String getHeading() { 
      return heading; 
     } 

     public void setHeading(String heading) { 
      this.heading = heading; 
     } 

     public Integer getColor() { 
      return color; 
     } 

     public void setColor(Integer color) { 
      this.color = color; 
     } 
    } 

    static class InnerData { 
     String name; 
     String category; 
     Integer categoryIcon; 
     String description; 
     String rules; 
     String time; 
     String date; 
     String venue; 
     Boolean notifyState; 
     Integer notifyTime; 
     Boolean favouriteState; 

     public String getName() { 
      return name; 
     } 

     public void setName(String name) { 
      this.name = name; 
     } 

     public String getCategory() { 
      return category; 
     } 

     public void setCategory(String category) { 
      this.category = category; 
     } 

     public Integer getCategoryIcon() { 
      return categoryIcon; 
     } 

     public void setCategoryIcon(Integer categoryIcon) { 
      this.categoryIcon = categoryIcon; 
     } 

     public String getDescription() { 
      return description; 
     } 

     public void setDescription(String description) { 
      this.description = description; 
     } 

     public String getRules() { 
      return rules; 
     } 

     public void setRules(String rules) { 
      this.rules = rules; 
     } 

     public String getTime() { 
      return time; 
     } 

     public void setTime(String time) { 
      this.time = time; 
     } 

     public String getDate() { 
      return date; 
     } 

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

     public String getVenue() { 
      return venue; 
     } 

     public void setVenue(String venue) { 
      this.venue = venue; 
     } 

     public Boolean getNotifyState() { 
      return notifyState; 
     } 

     public void setNotifyState(Boolean notifyState) { 
      this.notifyState = notifyState; 
     } 

     public Integer getNotifyTime() { 
      return notifyTime; 
     } 

     public void setNotifyTime(Integer notifyTime) { 
      this.notifyTime = notifyTime; 
     } 

     public Boolean getFavouriteState() { 
      return favouriteState; 
     } 

     public void setFavouriteState(Boolean favouriteState) { 
      this.favouriteState = favouriteState; 
     } 
    } 
} 

輸出是:

[{"first":{"heading":"October 01","color":-65281},"second":[{"name":"sdfds","category":"","categoryIcon":17301533,"description":"sfd","rules":"","time":"","date":"","venue":"","notifyState":false,"notifyTime":0,"favouriteState":false}]},{"first":{"heading":"November 01","color":-65281},"second":[{"name":"jkl","category":"","categoryIcon":17301533,"description":"klddjflk","rules":"","time":"sdkjfk","date":"djfkd","venue":"ldkfjf","notifyState":false,"notifyTime":0,"favouriteState":false}]},{"first":{"heading":"October 31","color":-16175867},"second":[{"name":"Event name","category":"Event Category","categoryIcon":17301533,"description":"Event Description","rules":"Events Rules","time":"13:55","date":"31-10-2017","venue":"Event Venue","notifyState":false,"notifyTime":0,"favouriteState":false},{"name":"dsf","category":"","categoryIcon":17301533,"description":"","rules":"","time":"","date":"","venue":"","notifyState":false,"notifyTime":0,"favouriteState":false},{"name":"","category":"","categoryIcon":17301533,"description":"","rules":"","time":"","date":"","venue":"","notifyState":false,"notifyTime":0,"favouriteState":false},{"name":"","category":"","categoryIcon":17301533,"description":"","rules":"","time":"","date":"","venue":"","notifyState":false,"notifyTime":0,"favouriteState":false},{"name":"","category":"","categoryIcon":17301533,"description":"","rules":"","time":"","date":"","venue":"","notifyState":false,"notifyTime":0,"favouriteState":false},{"name":"","category":"","categoryIcon":17301533,"description":"","rules":"","time":"","date":"","venue":"","notifyState":false,"notifyTime":0,"favouriteState":false},{"name":"","category":"","categoryIcon":17301533,"description":"","rules":"","time":"","date":"","venue":"","notifyState":false,"notifyTime":0,"favouriteState":false},{"name":"","category":"","categoryIcon":17301533,"description":"","rules":"","time":"","date":"","venue":"","notifyState":false,"notifyTime":0,"favouriteState":false},{"name":"","category":"","categoryIcon":17301533,"description":"","rules":"","time":"","date":"","venue":"","notifyState":false,"notifyTime":0,"favouriteState":false}]}] 
-65281