我正在尝试使用 genson 将 json 字符串反序列化为 java 对象,但无法成功。我的类结构是这样的:
public class Condition {
}
public class SimpleCondition extends Condition {
String feature;
String op;
String value;
int primitive;
}
public class ComplexCondition extends Condition {
private Condition left;
private String joint;
private Condition right;
}
如您所见,ComplexCondition
可能有另一个 ComplexCondition
或 SimpleCondition
作为其 left
和 left
的成员对
。我得到的json是这样的:
{
"left": {
"feature":"locality",
"op":"==",
"value":"Chino"
"primitive":9,
},
"joint":"and",
"right": {
"feature":"ch4",
"op":">=",
"value":"1.5",
"primitive":3
}
}
在此 json 中,ComplexCondition
具有 left
和 right
作为 SimpleCondition
。但我收到的通用 json 字符串可以是从 SimpleCondition 到 ComplexCondition 的任何级别嵌套的任何内容。我尝试在 json 字符串中设置 @class
值,但 genson 仍然无法反序列化它。我感谢使用任何库将此 json 反序列化为 java 的任何帮助。
最佳答案
您可以为您的类注册一些别名,然后在 json 中引用它们,如下所示:
Genson genson = new GensonBuilder()
.addAlias("ComplexCondition", ComplexCondition.class)
.addAlias("SimpleCondition", SimpleCondition.class)
.create();
{
"@class": "ComplexCondition",
"left": {
"@class": "SimpleCondition",
"feature":"locality",
"op":"==",
"value":"Chino",
"primitive":9
},
"joint":"and",
"right": {
"@class": "SimpleCondition",
"feature":"ch4",
"op":">=",
"value":"1.5",
"primitive":3
}
}
您还需要为您的 ComplexCondition 添加 get 和 set 方法,或者将其字段公开,或者提供一个将它们作为参数的构造函数,或者将 genson 配置为使用私有(private)字段。
最后要注意的是,类元数据属性必须在不带 @ 前缀的属性之前定义。如果您使用 Genson 生成此 json,它将始终遵守此约束。
关于java - 使用多态成员将 Json 反序列化为 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37424659/