2016-10-14 50 views
3

我寫了一個自定義解串器來僅使用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); 

這個偉大的工程。但正如您在自定義解串器中看到的,我很難編碼事件字段值。這將通過主類中的其他實例變量傳遞。我必須將此字段傳遞給自定義解串器。那麼有沒有辦法在解串器內部訪問這個變量?或者有沒有其他的方法可以實現這一目標?請幫助我。謝謝。

+1

可能已經在這裏回答http://stackoverflow.com/questions/2713316 1 /如何對通構造參數與 - 傑克遜。這有幫助嗎? –

+0

@DanielScott對於遲到的回覆感到抱歉。是的,我確實瀏覽了您發佈的鏈接。對我來說問題是我有一個使用'@ deserialize'註解的MixIn類。即使如果我創建一個構造函數來獲取我需要傳遞的值,如何使用MixIn類來完成此操作?你能解釋一下,如果你知道嗎?謝謝 – 15R6

回答

2

最終得到了答案。感謝Philip在這個link

我只需要做這件事。

創建InjectableValues的實例

private InjectableValues newInjectableValues() { 
    return new InjectableValues.Std() 
    .addValue("event", "proxy") 
} 

使用這種方法來設置映射類

GeneralDomain readValue = mapper.setInjectableValues(injectEventType()).readValue(json, GeneralDomain.class); 

的injectablevalues方法在我的反序列化方法我不得不檢索由InjectableValues提供的值:

String event = String.valueOf(ctxt.findInjectableValue("event", null, null)); 
相關問題