2014-03-29 39 views
3

我想解析使用Gson庫的Json字符串到Java對象,但我遇到了StackoverflowException。在Gson的Stackoverflow異常

java.lang.StackOverflowError 
    com.google.gson.internal.$Gson$Types.checkNotPrimitive($Gson$Types.java:431) 
    com.google.gson.internal.$Gson$Types.access$000($Gson$Types.java:42) 
    com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:540) 
    com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:108) 
    com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:549) 
    com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:108) 
    com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:542) 
    com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:108) 
    com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:549) 
    com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:108) 

JSON字符串:

{"password":"[email protected]","role":"normaluser","name":"Archana Chatterjee","username":"a.chatterjee","designation":"Teacher","id":"T_02","age":42} 

解析代碼:

Entity entity = null; 
entity = gson.fromJson(json, Staff.class); 

Java類:

public class Staff extends LoginEntity { 
    Logger logger = Logger.getRootLogger(); 

    @SerializedName("name") 
    String name; 

    @SerializedName("designation") 
    String designation; 

    @SerializedName("role") 
    String role; 

    @SerializedName("age") 
    int age; 

} 
public abstract class LoginEntity extends Entity { 
    private static final Logger logger = Logger.getRootLogger(); 

    @SerializedName("username") 
    String mailid; 

    @SerializedName("password") 
    String password; 

} 
Root class for all. 
public abstract class Entity { 
    Logger logger = Logger.getRootLogger(); 

    @SerializedName("id") 
    public String id; 
} 

我也在Gson2.2.2中找到related error,但是我使用的是Gson 2.2.4。所以,只是想確保這是我的錯誤還是在鏈接中提到的錯誤。

+0

即使您刪除序列化類中的記錄器成員,它是否會發生? –

+0

沒有'記錄器'它工作正常。 :)但我無法理解這種行爲。如果你只是在一個答案中解釋這一點,這將是很好的,所以如果有人面臨同樣的問題,那麼他不需要像我這樣的幾個小時挖掘它。 – guptakvgaurav

+0

我沒有看到它比鏈接到的頁面更多,但它似乎試圖解決類的所有成員的類型,並出於某種原因與記錄器失敗。如果不仔細觀察記錄器類型,我不能告訴你更多的東西:)希望別人能更好地理解實際問題。 –

回答

5

Gson User Guide

如果一個字段被標記短暫的,(默認),它被忽略,不包括在JSON序列化和反序列化。

...

默認情況下,如果標記字段作爲短暫的,它會被排除在外。至於 那麼,如果一個字段被標記爲「靜態」,那麼默認情況下它將被排除在 之外。

因此,解決問題的方法很簡單,就是標記您logger爲瞬態或靜態的,例如:

transient Logger logger = Logger.getRootLogger(); 

這樣的變量將序列化和反序列化被排除在外,而你不會得到那個錯誤。

+2

這將解決這個問題,我認爲你是正確的,因爲在序列化記錄器實例沒有意義。另外,Gson代碼中似乎存在一個真正的錯誤,它試圖解決泛型類型聲明。因此,仍然可以提交錯誤報告以使錯誤得到修復,因爲這可能會影響其他有效用例。 – StaxMan