我正在尝试使用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 。所以,只是想确保这是我的错误还是在链接中提到了错误。
答案 0 :(得分:6)
如果某个字段标记为瞬态,(默认情况下)它将被忽略,并且不会包含在JSON序列化或反序列化中。
...
默认情况下,如果将字段标记为瞬态,则会将其排除。如 好吧,如果一个字段标记为“静态”,那么默认情况下它将是 排除。
因此,问题的解决方案只是将logger
标记为瞬态或静态,例如:
transient Logger logger = Logger.getRootLogger();
这样变量将从序列化和反序列化中排除,你不会得到那个错误。