将字段传递给自定义反序列化器类Jackson

15R*_*5R6 5 java json jackson deserialization

我编写了一个自定义反序列化器来使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我也有一个mixin类,可以添加额外的注释.

@JsonDeserialize(using = GeneralDeserializer.class)
public class GeneralDomainMixIn{}
Run Code Online (Sandbox Code Playgroud)

我以这种方式获取对象,

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);
Run Code Online (Sandbox Code Playgroud)

这非常有效.但正如您在自定义反序列化器中看到的那样,我很难对事件字段值进行编码.这将由主类中的其他实例变量传递.我必须将此字段传递给自定义反序列化器.那么有没有办法在反序列化器中访问这个变量?或者还有其他替代方法来实现这一目标吗?请帮帮我.谢谢.

15R*_*5R6 5

终于得到了答案。在此链接中感谢菲利普。

我所要做的就是这个。

创建一个 InjectableValues 实例

private InjectableValues injectEventType() {
  return new InjectableValues.Std()
    .addValue("event", "proxy")
}
Run Code Online (Sandbox Code Playgroud)

使用此方法设置injectEventType映射器类中的方法

GeneralDomain readValue = mapper.setInjectableValues(injectEventType()).readValue(json, GeneralDomain.class);
Run Code Online (Sandbox Code Playgroud)

在我的反序列化方法中,我必须检索 InjectableValues 提供的值:

String event = String.valueOf(ctxt.findInjectableValue("event", null, null));
Run Code Online (Sandbox Code Playgroud)