【问题标题】:Deserialize JSON into JPA managed entities with Jackson使用 Jackson 将 JSON 反序列化为 JPA 托管实体
【发布时间】:2016-03-18 13:53:39
【问题描述】:

当使用 Jackson 反序列化 JPA @Entity 时,我希望 Jackson 在托管实例上运行(如果存在),然后反序列化其上的所有属性;否则创建一个新的瞬态。

假设我在数据库中有一个Person

+----+------+--------------+
| id | name | favoriteHero |
+----+------+--------------+
| 21 | John | NULL         |
+----+------+--------------+

我想反序列化这个 JSON

{
    "id": 21,
    "favoriteHero": "Batman"
}

使用

Person john = objectMapper.readValue(jsonString, Person.class);

那么我需要 john 作为 JPA 托管实体,首先由 id 从持久性上下文中检索,然后将 favoriteHero 设置为 Batman,以便

john.getId() == 21;
john.getName() == "John";
john.getFavoriteHero() == "Batman";

有可能吗?

我尝试使用JsonDeserializer,但它会使用从数据库中检索到的实体,而不是继续设置值(如果在数据库中找不到,它不能回退到默认反序列化)。

【问题讨论】:

  • 我无法使用@JsonCreator,因为我无法将实体代码与数据库层混淆。

标签: java json hibernate jpa jackson


【解决方案1】:

我认为您可以使用 GSON 做到这一点,如果您是这个意思:https://github.com/google/gson 示例:

Gson gson = new GsonBuilder().create();
Person p = gson.fromJson(reader, Person.class);

【讨论】:

  • 我需要坚持使用Jackson,因为所有项目都使用它。另外,您提供的示例不会提供托管实体(即从持久性上下文中检索)。
【解决方案2】:

这已经完成了。为什么要重新发明轮子。使用Spring Data Rest

【讨论】:

  • 我无法更改项目中的整个 REST API,我只需要一种 Jackson 方式以 JPA 兼容的方式反序列化 JSON。
  • @MarkOfHall 您能否提供一些使用 Spring Data Rest 执行此操作的示例?
猜你喜欢
  • 2014-07-08
  • 1970-01-01
  • 2019-04-10
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多