Jackson:在反序列化时设置 class/object 不是来自 JSON 的属性

Jackson: Set class/object properties that are not coming from JSON when deserializing

我有以下 POJO:

public class POJO {
  private final String id;
  private final String name;
  // constructor, getters omitted
}

这是我的 JSON:

{
  "name":"foo"
}

我从代码中的其他地方获得了 id 值。

我想以某种方式将我的外部 id 值与 JSON 结合起来,这样 Jackson 就可以构建一个包含这两个值的 POJO 实例。

下面是一些示例代码:

public void deserialize() {
  ObjectMapper om = new ObjectMapper();

  String id = "123";
  String json = "{\"name\":\"foo\"}";

  POJO pojo = om.readValue(json, POJO.class);

  System.out.println(pojo.getId());
  System.out.println(pojo.getName());
}

如何告诉 Jackson 设置 id 值?


我已经知道我可以使用 om.readTree(json) 然后将其转换为 ObjectNode 然后 put("id", id) 然后创建一个 om.readerFor(POJO.class) 并调用 readValue(objectNode) .但我猜 Jackson 现在将完成它的工作两次。

有没有其他方法可以简单地注入一些外部属性?

我想我找到了正确的解决方案:

@JacksonInject

示例:

public class POJO {
  @JacksonInject("id")
  private final String id;
  private final String name;
}

反序列化代码:

public void deserialize() {
  ObjectMapper om = new ObjectMapper();

  String id = "123";
  String json = "{\"name\":\"foo\"}";

  InjectableValues values = new InjectableValues.Std().addValue("id", id);

  POJO pojo = om.reader(values).forType(POJO.class).readValue(json);

  System.out.println(pojo.getId());
  System.out.println(pojo.getName());
}

如果有任何更好/更快/更简单的解决方案,请随时添加另一个答案:)