2

我对 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( ).

那么如何为抽象类获得正确的输出呢?

4

3 回答 3

2

对于抽象类,您需要编写自己的适配器。请参阅有关该主题的这篇文章

于 2013-03-31T13:42:28.603 回答
2

查看代码,我可以看到 Gson 排除了匿名内部类。我有最好的解释是因为 Gson 的理念是支持对称序列化和反序列化,正如这个 bug中所解释的:

不要使用双括号初始化。它可以防止 [反] 序列化,而 Gson 专为对称序列化和 [反] 序列化而设计。

没有自定义就不可能反序列化内部类。从用户指南

Gson 还可以反序列化静态嵌套类。但是,Gson 不能自动反序列化纯内部类,因为它们的无参数构造函数还需要对包含 Object 的引用,而在反序列化时这是不可用的。

因此 Gson 阻止了序列化。您可以将匿名内部类改为静态嵌套类,它会起作用。

于 2013-03-31T14:20:36.573 回答
0

抱歉有点晚了,但是对于那些不想创建嵌套类的人,您可以使用它:

AbstractPayload payload = new AbstractPayload("field") {};
String result = gson.toJson(payload, AbstractPayload.class)

这适用于我的情况

于 2020-01-14T13:20:30.760 回答