我使用带有类的库来映射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; ??
答案 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课程。