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());
}
如果有任何更好/更快/更简单的解决方案,请随时添加另一个答案:)
我有以下 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());
}
如果有任何更好/更快/更简单的解决方案,请随时添加另一个答案:)