假设我有一个有很多字段的POJO。我还有一个包含大量属性的地图,可以很好地映射到POJO中的字段。现在我想将地图中的属性应用到我的POJO中。我怎么能这样做?
杰克逊提供方法new ObjectMapper().convertValue()
,但这会创建一个新的POJO实例。我真的必须这样做吗?
om = new ObjectMapper();
pojoMap = om.convertValue(pojo, Map.class);
pojoMap.putAll(properties);
pojo = om.convertValue(pojoMap, Pojo.class);
有没有更简单的方法?
由于我没有GSON的经验,我们也在这里躺着,我怎么能用GSON做到这一点?
答案 0 :(得分:3)
是的,您可以使用ObjectMapper
的{{1}}方法创建一个ObjectReader,它将从根JSON对象更新现有实例,而不是实例化新实例:
@Test
public void apply_json_to_existing_object() throws Exception {
ExampleRecord record = new ExampleRecord();
ObjectReader reader = mapper.readerForUpdating(record)
.with(JsonParser.Feature.ALLOW_SINGLE_QUOTES)
.with(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES);
reader.readValue("{ firstProperty: 'foo' }");
reader.readValue("{ secondProperty: 'bar' }");
assertThat(record.firstProperty, equalTo("foo"));
assertThat(record.secondProperty, equalTo("bar"));
}
public static class ExampleRecord {
public String firstProperty;
public String secondProperty;
}
您还可以从现有ObjectReader
创建价值更新阅读器。以下声明似乎相同:
ObjectReader reader = mapper.reader(ExampleRecord.class)
.withValueToUpdate(record)
.with(/* features etc */);
加成
但上述内容并没有真正回答你的问题。
由于您没有想要以JSON的形式对记录进行更改,而是将其作为地图,因此您必须完成这些操作以便杰克逊读取您的地图。你不能直接做,但你可以写" JSON"输出到令牌缓冲区,然后将其读回:
@Test
public void apply_map_to_existing_object_via_json() throws Exception {
ExampleRecord record = new ExampleRecord();
Map<String, Object> properties = ImmutableMap.of("firstProperty", "foo", "secondProperty", "bar");
TokenBuffer buffer = new TokenBuffer(mapper, false);
mapper.writeValue(buffer, properties);
mapper.readerForUpdating(record).readValue(buffer.asParser());
assertThat(record.firstProperty, equalTo("foo"));
assertThat(record.secondProperty, equalTo("bar"));
}
(顺便说一句,如果这看似费力,序列化到令牌缓冲区并再次反序列化实际上是ObjectMapper.convertValue
的实现方式,所以它的功能并没有太大的变化)