Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Gson中的Stackoverflow异常_Java_Json_Gson_Stack Overflow - Fatal编程技术网

Java Gson中的Stackoverflow异常

Java 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

我试图使用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);
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是有意义的,因为它可能会影响其他有效的用例。