我的护目镜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( )
。
那么如何为抽象类获得正确的输出呢?
答案 0 :(得分:2)
如果是抽象类,则需要编写自己的适配器。有关该主题,请参阅this article。
答案 1 :(得分:2)
查看代码,我可以看到Gson排除了匿名内部类。我得到的最好解释是因为Gson的哲学是支持对称序列化和反序列化,如this bug中所述:
不要使用双括号初始化。它阻止[de]序列化,Gson设计用于对称序列化和[de]序列化。
如果没有自定义,就无法对内部类进行反序列化。来自users guide:
因此Gson阻止了序列化。你可以将匿名内部类改为静态嵌套类,它可以工作。Gson也可以反序列化静态嵌套类。但是,Gson不能自动反序列化纯内部类,因为它们的no-args构造函数还需要对反序列化时不可用的包含Object的引用。
答案 2 :(得分:0)
对此感到抱歉,但是对于那些不想创建嵌套类的人,可以使用以下方法:
AbstractPayload payload = new AbstractPayload("field") {};
String result = gson.toJson(payload, AbstractPayload.class)
这对我来说很有效