Java Gson中的Stackoverflow异常
我试图使用Gson库将Json字符串解析为Java对象,但遇到了StackoverflowExceptionJava Gson中的Stackoverflow异常,java,json,gson,stack-overflow,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.goo
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);
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;
}
Java类:
Entity entity = null;
entity = gson.fromJson(json, Staff.class);
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中也发现了这一点,但我使用的是Gson2.2.4。所以,只想确定这是我这边的错误还是链接中提到的错误。来自:
如果一个字段被标记为transient(默认情况下),它将被忽略,并且不包括在JSON序列化或反序列化中
默认情况下,如果将字段标记为瞬态,则会将其排除在外。作为
那么,如果一个字段被标记为“静态”,那么默认情况下它将是静态的
排除在外
因此,解决问题的方法就是简单地将记录器标记为瞬态或静态,例如:
transient Logger logger = Logger.getRootLogger();
这样,变量将从序列化和反序列化中排除,您将不会得到该错误
更新:一个@Expose(serialize=boolean)
注释,用于明确说明您想要序列化的内容和不想要序列化的内容。但是,为了尊重它,您必须在GsonBuilder上调用.excludeFieldsWithoutExposeAnnotation()
,并注释您希望公开的每个字段。即使删除序列化类中的记录器成员,也会发生这种情况吗?没有记录器
,它工作正常。)但我无法理解这种行为。如果你能在回答中解释这一点就好了,这样如果有人面临同样的问题,那么他就不必像我一样钻研几个小时了。除了你链接到的页面之外,我没有对它进行更多的研究,但它似乎试图解决类中所有成员的类型,并且由于某种原因无法使用Logger。如果不更仔细地研究记录器类型,我不能告诉您更多:)希望其他人能更好地理解实际问题;entity=gson.fromJson(json,Staff.class);您的Staff类还将包含LoginEntity和Entity的属性这将解决这个问题,我认为您是对的,序列化logger实例没有意义。此外,Gson试图解析泛型类型声明的代码中似乎存在一个真正的bug。因此,仍然提交bug报告以便修复bug是有意义的,因为它可能会影响其他有效的用例。