Gson中的Stackoverflow异常

Gau*_*pta 4 java stack-overflow json gson

我试图使用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)
Run Code Online (Sandbox Code Playgroud)

Json字符串:

{"password":"ac@123","role":"normaluser","name":"Archana Chatterjee","username":"a.chatterjee","designation":"Teacher","id":"T_02","age":42}
Run Code Online (Sandbox Code Playgroud)

解析代码:

Entity entity = null;
entity = gson.fromJson(json, Staff.class);
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

我也在Gson2.2.2中发现了相关的错误,但我使用的是Gson 2.2.4.所以,只是想确保这是我的错误还是在链接中提到错误.

yuv*_*val 6

来自Gson用户指南:

如果字段标记为瞬态(默认情况下),则忽略该字段,并且不包括在JSON序列化或反序列化中.

...

默认情况下,如果将字段标记为瞬态,则会将其排除.同样,如果字段标记为"静态",则默认情况下将其排除.

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

transient Logger logger = Logger.getRootLogger();
Run Code Online (Sandbox Code Playgroud)

这样,变量将从序列化和反序列化中排除,您将不会收到该错误.

  • 这将解决这个问题,我认为你是正确的,因为序列化logger实例是没有意义的.此外,Gson的代码中似乎存在一个真正的错误,试图解析泛型类型声明.因此,仍然可以提交错误报告,以便修复错误,因为它可能会影响其他有效的用例. (2认同)