我有一个问题与goggles Gson库。看看下面的代码:
public abstract class Main {
public String foo = "foo";
public List<String> bar = Arrays.asList( "foo", "bar" );
@Override
public String toString( ) {
Gson gson = new Gson( );
return gson.toJson( this );
}
public static void main( String[] args ) {
Main main = new Main( ) {
};
System.out.println(main.toString( ));
}
}
打印null
。但是我希望它打印{"foo":"foo","bar":["foo","bar"]}
,当我在Main( )
创建后删除抽象标识符和花括号时,它会这样做。
那么我如何得到一个抽象类的正确输出呢?
如果是抽象类,则需要编写自己的适配器。
查看代码,我可以看到Gson排除了匿名内部类。我认为最好的解释是因为Gson的理念是支持对称序列化和反序列化,就像这个bug中解释的那样:
不要使用双括号初始化。它可以防止[de]序列化,Gson是为对称序列化和[de]序列化而设计的。
不自定义是不可能反序列化内部类的。用户指南:
Gson还可以反序列化静态嵌套类。但是,Gson不能自动反序列化纯内部类,因为它们的无参数构造函数还需要对包含对象的引用,而在反序列化时该引用不可用。
因此Gson阻止序列化。您可以将匿名内部类改为静态嵌套类,这样就可以了。
抱歉说的有点晚了但是对于那些不想创建嵌套类的人你可以使用这个:
AbstractPayload payload = new AbstractPayload("field") {};
String result = gson.toJson(payload, AbstractPayload.class)