Gson中的Stackoverflow异常

时间:2014-03-29 17:40:10

标签: java json gson stack-overflow

我正在尝试使用Gson库将Json字符串解析为Java对象,但我遇到了StackoverflowException。

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":"ac@123","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 。所以,只是想确保这是我的错误还是在链接中提到了错误。

1 个答案:

答案 0 :(得分:6)

来自Gson User Guide

  

如果某个字段标记为瞬态,(默认情况下)它将被忽略,并且不会包含在JSON序列化或反序列化中。

     

...

     

默认情况下,如果将字段标记为瞬态,则会将其排除。如   好吧,如果一个字段标记为“静态”,那么默认情况下它将是   排除。

因此,问题的解决方案只是将logger标记为瞬态或静态,例如:

transient Logger logger = Logger.getRootLogger();

这样变量将从序列化和反序列化中排除,你不会得到那个错误。