0

我有以下 POJO:

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

这是我的 JSON:

{
  "name":"foo"
}

id从代码中的其他地方获取值。

我想以id某种方式将我的外部值与 JSON 结合起来,因此杰克逊可以构建一个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)并调用readValue(objectNode). 但我猜杰克逊现在会做两次它的工作。

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

4

1 回答 1

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

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

于 2017-04-11T19:48:35.307 回答