2016-10-05 24 views
2

我想通过编写自定义反序列化器反序列化json。 这是我的代码。使用jackson添加自定义反序列化类到已经存在的@JsonDeserialize注解

public class EventLoginDeserializer extends StdDeserializer<EventLogin> { 

    public EventLoginDeserializer() { 
     this(null); 
    } 

    public EventLoginDeserializer(Class<EventLogin> event) { 
     super(event); 
    } 

    @Override 
    public EventLogin deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) 
      throws IOException, JsonProcessingException { 
     JsonNode jsonNode = jsonParser.getCodec().readTree(jsonParser); 
     return EventLogin.builder().displayName(jsonNode.get("display_name")) 
       .timestamp(DateTime.now()).build(); 
    } 

    @Override 
    public Class<EventLogin> handledType() { 
     return EventLogin.class; 
    } 
} 

这里是我的主类的片段。

ObjectMapper mapper = new ObjectMapper(); 
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

SimpleModule module = new SimpleModule(); 
module.addDeserializer(EventLogin.class, new EventLoginDeserializer()); 
mapper.registerModule(module); 

String json = "{\"display_name\": \"Test Deserialization\", \"user_name\": \"test\"}"; 

EventLogin eventLogin = mapper.readValue(json, EventLogin.class); 
System.out.println("readValue :::: " + eventLogin); 

我已经在那里我已经把jar文件已经存在@JsonDeserialize注释模型类,并添加上述多一个反序列化类的要求。我的意思是这里的源文件中已经存在的类是相同的。

@AutoValue 
@JsonDeserialize(builder = AutoValue_EventLogin.Builder.class) 
@JsonInclude(JsonInclude.Include.NON_NULL) 
public abstract class EventLogin 
{ 
    public abstract String displayName(); 
    public abstract DateTime timestamp(); 

    @AutoValue.Builder 
    public abstract static class Builder implements Login.Builder<Builder> { 

    public abstract Builder displayName(String displayName); 
     public abstract Builder emailId(DateTime timestamp); 

     public abstract EventLogin build(); 
    } 
} 

的问题是,由于@JsonDeserialize在jar文件已经存在,所以加入没有被视为自定义解串器在所有。意思是,自定义反序列化器类没有被执行的重写的反序列化方法。

那么如何克服这个问题呢?提前致谢。

回答

0

去解决。 Jackson让我们用mixin覆盖那些属性指定的值,所以我们可以创建一个mixin类并添加对象映射器。

@JsonDeserialize(using = EventLoginDeserializer.class) 
public static class EventLoginMixIn{} 

,然后在我们的主类

ObjectMapper mapperWithMixin = new ObjectMapper() 
     .addMixIn(EventLogin.class, EventLoginMixIn.class); 

// Deserialize the eventlogin 
EventLogin eventLogin = mapperWithMixin.readValue(actualJson, EventLogin.class); 
相关问题