【问题标题】:How to create a virtual JSON property when serializing?序列化时如何创建虚拟 JSON 属性?
【发布时间】:2017-04-26 14:45:51
【问题描述】:

我有一个为我的实体提供一些通用属性的抽象类。以下为节选:

@MappedSuperclass
public class AbstractEntity implements Serializable {
    @Id
    @GeneratedValue
    private long id;

    @Temporal(value = TemporalType.TIMESTAMP)
    @JsonProperty(access = Access.READ_ONLY)
    private Date createdOn;

    @Temporal(value = TemporalType.TIMESTAMP)
    @JsonProperty(access = Access.READ_ONLY)
    private Date modifiedOn;

    ⋮
}

将子类序列化为 JSON 时,我得到了预期的结果,例如,这是序列化的摘录:

{
  "createdOn": "2016-12-11T15:35:23Z",
  "modifiedOn": "2016-12-11T15:35:23Z",
    ⋮
}

我需要将这些通用属性序列化为 JSON 对象,以便上面的示例如下所示:

{
  "_metadata": {
    "createdOn": "2016-12-11T15:35:23Z",
    "modifiedOn": "2016-12-11T15:35:23Z",
  }
    ⋮
}

我已经尝试过使用名为Metadata 的类,并且拥有该类型的属性效果很好。但我想知道是否有更简单或更简单的方法只使用 Jackson 注释?

【问题讨论】:

标签: java json spring-boot jackson spring-data-rest


【解决方案1】:

您可以创建一个 JPA @Embeddable 类,您应该会获得所需的输出。不知道还有什么比这更简单的。

可嵌入:

@Embeddable
public class MetaData{

    @Temporal(value = TemporalType.TIMESTAMP)
    @JsonProperty(access = Access.READ_ONLY)
    private Date createdOn;

    @Temporal(value = TemporalType.TIMESTAMP)
    @JsonProperty(access = Access.READ_ONLY)
    private Date modifiedOn;
}

实体:

@MappedSuperclass
public class AbstractEntity implements Serializable {
    @Id
    @GeneratedValue
    private long id;

    @Embedded
    private Metadata metdata;
}

【讨论】:

  • 这是我尝试过的解决方案,确实有效。问题是,默认情况下,Spring Data REST 在 JSON 序列化中不包含 id,我想将它包含在元数据对象中。我可以将它传递给构造函数,但随后我正在复制数据,这并不优雅(除其他外)。
猜你喜欢
  • 1970-01-01
  • 2019-05-28
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多