Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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嵌套对象_Java_Json_Gson - Fatal编程技术网

Java Gson嵌套对象

Java Gson嵌套对象,java,json,gson,Java,Json,Gson,我使用一个带有类的库来映射json消息,并使用Gson通过json序列化这些类。该消息包含一个数据字段。该字段是泛型字段,它包含任何内容。图书馆提供的课程为: public class Api { .... @SerializedName("data") Map<String, JsonElement> data; .... } 我该怎么办?当然,我可以创建自己的类,但如果可能的话,我更愿意扩展库。如果我延长课程,我会: public class MyOwnRoot extends

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

public class Api {
....
@SerializedName("data")
Map<String, JsonElement> data;
....
}
我该怎么办?当然,我可以创建自己的类,但如果可能的话,我更愿意扩展库。如果我延长课程,我会:

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

但是在这种情况下,当我序列化它时,它不起作用,因为myownroot必须是数据的子级,但是我怎么能对Gson说“将myownroot放在数据映射中”?

我真的不明白为什么需要扩展Api类。 我猜类名有点用词不当,因为API是(一般来说)接口,它们是实现的

我想您可以通过使用getter来实现这一点,同时让Gson在字段上完成它的工作

编辑:也要序列化 这将导致:

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

我仍然不明白为什么要扩展Api类。

类Blah扩展Api
?这很明显,但如果我以这种方式扩展类,我无法重新定义数据字段。还不清楚为什么需要这样做。字段被继承请参见编辑我认为您必须编写自定义序列化程序才能处理您的请求。序列化很方便,因为我可以使用扩展类调用toJson方法。那么,这是一个答案还是我误解了您试图实现的目标?您的代码非常适合反序列化,但我想序列化调用toJson
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() + "]";
    }

}
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]