【问题标题】:Spring REST JSON serialization/deserialization of composite polymorphic typesSpring REST JSON 序列化/反序列化复合多态类型
【发布时间】:2016-12-22 19:21:44
【问题描述】:

我将 Spring/Spring Boot 和 Spring MVC 与 @RestController 一起使用

我有一个复合模型对象:

public abstract class BaseQuery {

    private final Long characteristicId;

...

}

public abstract class ComparableQuery extends BaseQuery {

    private final Object value;

    private final String comparisonOperator;

...

}

public class GreaterOrEqualQuery extends ComparableQuery {

    public GreaterOrEqualQuery(Long characteristicId, Object value) {
        super(characteristicId, value, ">=");
    }

}

public class EqualQuery extends ComparableQuery {

    public EqualQuery(Long characteristicId, Object value) {
        super(characteristicId, value, "=");
    }

}

public class GreaterQuery extends ComparableQuery {

    public GreaterQuery(Long characteristicId, Object value) {
        super(characteristicId, value, ">");
    }

}

public class CompositQuery extends BaseQuery {

    private final String operator;
    private final BaseQuery[] queries;

    public CompositQuery(Long characteristicId, Operator operator, BaseQuery... queries) {
        super(characteristicId);
        this.operator = operator.value;
        this.queries = queries;
    }

...

}

等等

此模型的示例用法如下所示:

Set<BaseQuery> queries = new HashSet<>();

BaseQuery megapixelCharacteristicQuery = new CompositQuery(megapixelCharacteristic.getCharacteristicId(), CompositQuery.Operator.AND, new GreaterOrEqualQuery(megapixelCharacteristic.getCharacteristicId(), 10), new LessOrEqualQuery(megapixelCharacteristic.getCharacteristicId(), 50));
queries.add(megapixelCharacteristicQuery);
queries.add(new EqualQuery(androidCharacteristic.getCharacteristicId(), true));

Set&lt;BaseQuery&gt; queries 的序列化 JSON 对象如下所示:

[
   {
      "operator":"AND",
      "queries":[
         {
            "value":10,
            "comparisonOperator":"\u003e\u003d",
            "characteristicId":391
         },
         {
            "value":50,
            "comparisonOperator":"\u003c\u003d",
            "characteristicId":391
         }
      ],
      "characteristicId":391
   },
   {
      "value":true,
      "comparisonOperator":"\u003d",
      "characteristicId":383
   }
]

我必须将这个或类似的 JSON 从客户端应用程序 (AngularJS) 传递到我的后端 REST API 端点,以便获得如上所述的正确反序列化模型(设置适当的条目,如 CompositQueryEqualQuery)。

现在,我的 Rest 控制器上的 Spring 应用程序后端逻辑无法使用适当的类正确反序列化此 JSON。

Spring 中是否有任何方法可以向此 JSON 提供一些元信息(或其他内容)以帮助 Spring 正确反序列化此结构?

【问题讨论】:

    标签: java json spring jackson spring-restcontroller


    【解决方案1】:

    您可以使用超类上的杰克逊注解来实现这一点,如下所示:

    import com.fasterxml.jackson.annotation.JsonIgnore;
    import com.fasterxml.jackson.annotation.JsonSubTypes;
    import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
    import com.fasterxml.jackson.annotation.JsonTypeInfo;
    
    @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "javaclass")
    @JsonSubTypes({
        @Type(value = GreaterOrEqualQuery.class),
        @Type(value = EqualQuery.class)
        //and so on...
    })
    public abstract class BaseQuery {
        ...
    }
    

    这会将javaclass 属性添加到json 表示中,这是use = JsonTypeInfo.Id.CLASS 的完全限定名称。为了简化此属性的值,请考虑 @JsonTypeInfouse 参数的不同选项(例如 JsonTypeInfo.Id.NAME)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-01
      • 2013-12-15
      • 1970-01-01
      相关资源
      最近更新 更多