Jackson:设置反序列化时不是来自JSON的类/对象属性

时间:2017-04-11 19:27:17

标签: jackson jackson2 jackson-databind

我有以下POJO:

!

这是我的JSON:

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

我从代码中的其他位置获取{ "name":"foo" } 值。

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

以下是一些示例代码:

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()); } 值?

我已经发现我可以使用id,然后将其投放到om.readTree(json)然后ObjectNode,然后创建put("id", id)并致电om.readerFor(POJO.class)。但我想杰克逊现在会做两次工作。

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

1 个答案:

答案 0 :(得分:0)

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

@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());
}

如果有更好/更快/更简单的解决方案,请随意添加其他答案:)