java - 使用多态成员将 Json 反序列化为 Java

标签 java json jackson json-deserialization genson

我正在尝试使用 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 可能有另一个 ComplexConditionSimpleCondition 作为其 leftleft 的成员。我得到的json是这样的:

{
  "left": {
            "feature":"locality",
            "op":"==",
            "value":"Chino"
            "primitive":9,
          },
  "joint":"and",
  "right": {
              "feature":"ch4",
              "op":">=",
              "value":"1.5",
              "primitive":3
           }
}

在此 json 中,ComplexCondition 具有 leftright 作为 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/

相关文章:

java - 使用 @JsonSubTypes 进行反序列化以获得无值 - 缺少属性错误

jackson - 使用 Jackson JSON 映射器序列化/反序列化 java 8 java.time

java - 为特定类中的特定类型自定义 Jackson Serializer

java - 如何使用 phantomjs headless 浏览器处理 selenium 中的警报

java - 在搜寻检视中搜寻,与项目不符

java - Java 中列表框和组合框的事件处理

json - 定义 JSON 模式货币类型

java - 如何使用基于 JDK 11 的 Java 应用程序使用 Java Soap Web 服务

c# - 使用子类反序列化 JSON 数据

javascript - 使用 AJAX 将 JSON 发送到 PHP