我编写了一个自定义反序列化程序,只使用jackson映射所需的字段。开始。
public class GeneralDeserializer extends JsonDeserializer<GeneralDomain> {
@Override
public GeneralDomain deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
final JsonNode jsonNode = jp.getCodec().readTree(jp);
final Map<String, String> map = new ObjectMapper().convertValue(jsonNode, Map.class);
final String event = "Proxy";
return new GeneralDomain(map.get("id"), event, map.get("name"), map.get("lastLogin"));
}
@Override
public Class<GeneralDomain> handledType() {
return GeneralDomain.class;
}
}
我也有一个mixin类,可以添加额外的注释。
@JsonDeserialize(using = GeneralDeserializer.class)
public class GeneralDomainMixIn{}
我以这种方式获取对象,
ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(GeneralDomain.class, SimpleRevealPublicEventMixIn.class);
String json = "{\"id\": 111, \"name\": David, \"lastLogin\": \"02-10-2016 10:32:00 AM\"}";
GeneralDomain readValue = mapper.readValue(json, GeneralDomain.class);
这很有效。但正如您在自定义反序列化器中看到的那样,我很难对事件字段值进行编码。这将由主类中的其他实例变量传递。我必须将此字段传递给自定义反序列化器。那么有没有办法在反序列化器中访问这个变量?或者有没有其他替代方法来实现这一目标?请帮帮我。感谢。
答案 0 :(得分:2)
终于得到了答案。感谢菲利普在这link。
所有我必须做的就是这个。
创建InjectableValues的实例
private InjectableValues injectEventType() {
return new InjectableValues.Std()
.addValue("event", "proxy")
}
使用此方法在mapper类中设置injectEventType
方法
GeneralDomain readValue = mapper.setInjectableValues(injectEventType()).readValue(json, GeneralDomain.class);
在我的反序列化方法中,我必须检索InjectableValues提供的值:
String event = String.valueOf(ctxt.findInjectableValue("event", null, null));