【问题标题】:Pass a field to custom deserializer class Jackson将字段传递给自定义反序列化器类 Jackson
【发布时间】:2016-10-14 18:36:00
【问题描述】:

我已经编写了一个自定义反序列化器来使用 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);

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

【问题讨论】:

  • 可能已经在这里回答了stackoverflow.com/questions/27133161/…。这有帮助吗?
  • @DanielScott 抱歉回复晚了。是的,我确实浏览了您发布的链接。对我来说问题是我有一个使用 @deserialize 注释的 MixIn 类。即使我创建了一个构造函数来获取我需要传递的值,如何使用 MixIn 类来做到这一点?如果你知道,你能解释一下吗?谢谢

标签: java json jackson deserialization


【解决方案1】:

终于找到答案了。感谢 Philip 在此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));

【讨论】:

    猜你喜欢
    • 2019-07-28
    • 2016-02-12
    • 2018-03-06
    • 2021-06-17
    • 2016-02-13
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    相关资源
    最近更新 更多