簡體   English   中英

將字段傳遞給自定義反序列化器類Jackson

[英]Pass a field to custom deserializer class Jackson

我編寫了一個自定義反序列化器來使用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);

這非常有效。 但正如您在自定義反序列化器中看到的那樣,我很難對事件字段值進行編碼。 這將由主類中的其他實例變量傳遞。 我必須將此字段傳遞給自定義反序列化器。 那么有沒有辦法在反序列化器中訪問這個變量? 或者有沒有其他替代方法來實現這一目標? 請幫幫我。 謝謝。

終於得到了答案。 感謝菲利普在這個鏈接

我所要做的就是這個。

創建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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM