【发布时间】:2013-11-25 10:54:14
【问题描述】:
我有一个 POJO
class Product {
String name;
Size size;
}
所以,我想将反序列化 JSON 映射到我的 POJO。如果我的 JSON 中有这两个属性,那不是问题。
但就我而言,有时大小不会成为 JSON 的一部分。可能有第三个属性“类型”,我将根据它设置我的大小。我不想在我的 POJO 中包含“类型”。是否有任何杰克逊注释可以做到这一点?
【问题讨论】:
我有一个 POJO
class Product {
String name;
Size size;
}
所以,我想将反序列化 JSON 映射到我的 POJO。如果我的 JSON 中有这两个属性,那不是问题。
但就我而言,有时大小不会成为 JSON 的一部分。可能有第三个属性“类型”,我将根据它设置我的大小。我不想在我的 POJO 中包含“类型”。是否有任何杰克逊注释可以做到这一点?
【问题讨论】:
编写您的自定义反序列化器:
SimpleModule module =
new SimpleModule("ProductDeserializerModule",
new Version(1, 0, 0, null));
module.addDeserializer(Product.class, new ProductJsonDeserializer());
mapper = new ObjectMapper();
mapper.registerModule(module);
//...
class ProductJsonDeserializer extends JsonDeserializer<Product>
{
@Override
public Product deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException
{
// handle here if exist a third attribute 'type' and create the product
}
}
更多信息在这里:http://wiki.fasterxml.com/JacksonHowToCustomDeserializers
【讨论】:
找到了一个非常简单的解决方案!
当尝试将 JSON 属性映射到我的 POJO 的属性时,它只会检查是否存在设置器。
例如,如果JSON中有一个属性type,它会尝试在我的POJO中命中一个名为setType(obj)的方法,而不管是否存在一个名为type的属性。
这对我有用!我只是在这个 setter 中设置了我的其他属性。
【讨论】: