我正在尝试使用Gson将涉及多态的对象序列化/反序列化为JSON.
这是我的序列化代码:
ObixBaseObj lobbyObj = new ObixBaseObj();
lobbyObj.setIs("obix:Lobby");
ObixOp batchOp = new ObixOp();
batchOp.setName("batch");
batchOp.setIn("obix:BatchIn");
batchOp.setOut("obix:BatchOut");
lobbyObj.addChild(batchOp);
Gson gson = new Gson();
System.out.println(gson.toJson(lobbyObj));
Run Code Online (Sandbox Code Playgroud)
这是结果:
{"obix":"obj","is":"obix:Lobby","children":[{"obix":"op","name":"batch"}]}
Run Code Online (Sandbox Code Playgroud)
序列化大多的作品,除了它缺少继承成员的内容(尤其是obix:BatchIn和obixBatchout字符串丢失).这是我的基类:
public class ObixBaseObj {
protected String obix;
private String display;
private String displayName;
private ArrayList<ObixBaseObj> children;
public ObixBaseObj()
{
obix = "obj";
}
public void setName(String name) {
this.name = name;
}
...
}
Run Code Online (Sandbox Code Playgroud)
这是我继承的类(ObixOp)的样子:
public class ObixOp extends ObixBaseObj {
private String in;
private String out;
public ObixOp() { …Run Code Online (Sandbox Code Playgroud) 我有一个类:
public class Barn {
String type;
Animal animal;
}
public class Horse extends Animal {
}
public class Cow extends Animal {
}
Run Code Online (Sandbox Code Playgroud)
我想序列化它们的列表:
List<Barn> barns = new ArrayList<Barn>();
Barn barn1 = new Barn();
barn1.setType("horse");
barn1.setAnimal(new Horse());
barns.add(barn1);
Barn barn2 = new Barn();
barn2.setType("cow");
barn2.setAnimal(new Cow());
barns.add(barn2);
...
Group<Barn> barns = gson.fromJson(serialized);
Run Code Online (Sandbox Code Playgroud)
当我序列化时,Animal属性的类型信息将丢失.有没有办法我可以以某种方式安装解析器监听器,以便我可以提供正确的类来反序列化,因为遇到列表中的每个元素?这就是手动提供描述类类型的字符串的想法.
谢谢
假设有一个抽象类,比方说A,和两个非抽象的子类,比如说A1和A2.我想通过使用GSON库从json格式"反序列化"它们.
我得到一个A对象数组.
int n = ...;
A[] list = new A[n];
A[0] = new A1(....);
A[1] = new A2(....);
...
Run Code Online (Sandbox Code Playgroud)
有人转换为JSON字符串,如下所示:
String json = (new Gson()).toJson(list);
Run Code Online (Sandbox Code Playgroud)
最后,如果我尝试反序列化如下
A[] deserializedList = (new Gson()).fromJson(json, A[].class);
Run Code Online (Sandbox Code Playgroud)
然后我有一个错误,因为GSON默认的反序列化器找到一个抽象类(即A),它不能猜测子类类型.
我怎么解决这个问题?
PS:我读过有关自定义反序列化器的内容,但在这种情况下我不明白如何使用它们.
想不出更好的措辞这个问题,但基本上我想在GSON中存储具体类的名称(参见"运动"):
{
"player" : {
"position" : { "x" : 300, "y" : 400 },
"scale" : 1,
"rotation" : 0,
"sprite" : {
"frames" : [ {
"fileName" : "data/plane.png"
} ],
"duration" : 1
}
},
"movementDelay" : { "elapsed" : 0, "started" : 0, "delay" : 150 },
"movement" : { "class" : "controller.TopDownGridMovement" }
}
Run Code Online (Sandbox Code Playgroud)
这是包含我要反序列化的Movement接口的类:
public class PlayerController {
private Player player;
private DelayTimer movementDelay;
private Movement movement;
public PlayerController() {
}
[...]
}
Run Code Online (Sandbox Code Playgroud)
我写了一个Custom …
我想使用google-gson将json数据解析为java对象.
以下是我要解析的数据示例:
{"isBean":{"userName":"test","password":"password112"}}
Run Code Online (Sandbox Code Playgroud)
IsBean.java
public interface IsBean extends Serializable,IsSerializable{
long getId();
}
Run Code Online (Sandbox Code Playgroud)
User.java
public class User implements IsBean,IsSerializable,Serializable {
String userName;
String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public long getId() {
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
RequestObj.java
public class RequestObj implements IsBean, Serializable,IsSerializable{
IsBean isBean;
@Override
public long getId() { …Run Code Online (Sandbox Code Playgroud)