Gson嵌套对象

时间:2017-06-07 17:01:26

标签: java json gson

我使用带有类的库来映射json消息,并且我使用Gson来通过json序列化类。该消息包含数据字段。该字段是通用的,它包含任何内容。图书馆提供的课程是:

public class Api {
....
@SerializedName("data")
Map<String, JsonElement> data;
....
}

现在我想扩展类,但是我有自己的根对象来映射数据子字段,所以要做一个json的总结如下:

{...., "data": {"myownroot":"aaaa"}}

我该怎么办?我当然可以创建自己的类,但如果可能的话我宁愿扩展库。如果我延长课程,我会:

public class MyOwnRoot extends Api {
@SerializedName("myownroot")
public String root;
}

但是在这种情况下,当我序列化时它不起作用,因为myownroot必须是数据的孩子,但我怎么能说Gson&#34;把MyOwnRoot放在数据图中&#34; ??

1 个答案:

答案 0 :(得分:1)

我无法理解为什么你需要扩展Api类。 我猜这个类名有点用词不当,因为API(一般来说)是接口,并且它们已经实现了。

我想你可以通过使用吸气剂来实现这一目标,同时让Gson在田间工作。

编辑:也要序列化

public class Api {
    @SerializedName("data")
    protected Map<String, JsonElement> data;
}

public class RootEntity extends Api {
    transient StructuredRootImpl _cached;
    transient Gson _gson = new Gson();

    public class StructuredRootImpl {
        Integer v;
        String name;
    }

    public Integer getV() {
        synch();
        return _cached.v;
    }

    public void setV(Integer v) {
        _cached.v=v;
        synch();
    }

    private void synch() {
        if(_cached==null){
            if(data==null){
                data = new LinkedHashMap<>();
            }
            JsonElement jsonElement = data.get("myroot");
            _cached = _gson.fromJson(jsonElement, StructuredRootImpl.class);
        }
        JsonElement jsonTree = _gson.toJsonTree(_cached);
        data.put("myroot", jsonTree);
    }

    public String getName() {
        synch();
        return _cached.name;
    }

    public void setName(String name) {
        _cached.name = name;
        synch();
    }

    @Override
    public String toString() {
        return "RootEntity [v=" + getV() + ", n=" + getName() + "]";
    }

}

运行main,您可以序列化和反序列化您的实体。

public class TestGson {

    public static void main(String[] args) {
        String jsonText = "{data:{\"myroot\":{\"v\":123,\"name\":\"mario\"}}}";
        Gson gson = new Gson();
        RootEntity entity = gson.fromJson(jsonText, RootEntity.class);
        System.out.println(entity);
        entity.setName("Alex");
        entity.setV(150);
        String thenBack = gson.toJson(entity);
        System.out.println(thenBack);

    }
}

这将导致:

so.alpha.TestGson$Foo@4b85612c
StructuredRoot [v=123, name=mario]

我仍然不明白为什么你要扩展Api课程。