java - Jackon 自定义解串器从未调用过

标签 java spring jackson json-deserialization objectmapper

这是我使用@JsonDeserialize 的属性

@Transient
@JsonDeserialize(using = SharedUserDeserializer.class)
private Set<UserVehicleMappingVO> sharedVehicle;

public Set<UserVehicleMappingVO> getSharedVehicle() {
    return sharedVehicle;
}
public void setSharedVehicle(Set<UserVehicleMappingVO> sharedVehicle) {
    this.sharedVehicle = sharedVehicle;
}

自定义反序列化器代码是

public class SharedUserDeserializer extends JsonDeserializer<Set<UserVehicleMappingVO>> {

@Override
public Set<UserVehicleMappingVO> deserialize(JsonParser paramJsonParser,
        DeserializationContext paramDeserializationContext)
        throws IOException, JsonProcessingException {
    try {
        Set<UserVehicleMappingVO> list = new ObjectMapper().readValue(paramJsonParser.toString(),
                new TypeReference<Set<UserVehicleMappingVO>>() {});
        return list;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return new HashSet<>();
}
}

但是解串器从未被调用。请帮忙

每次我收到此异常时......

 ERROR :::9,gajendranc@azuga.com - Exception in 
method===org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'trackee' on field 'sharedVehicle': rejected value 
[[{"userId":"5d48b74f-7da2-11e7-87bf-
1383429d1d89","expireTime":1504190100000}]]; codes 
 [typeMismatch.trackee.sharedVehicle,typeMismatch.sharedVehicle,
typeMismatch.java.util.Set,typeMismatch]; arguments 
[org.springframework.context.support.DefaultMessageSourceResolvable: codes 
[trackee.sharedVehicle,sharedVehicle]; arguments []; default message 
[sharedVehicle]]; default message [Failed to convert property value of type 
[java.lang.String] to required type [java.util.Set] for property 
'sharedVehicle'; nested exception is java.lang.IllegalStateException: Cannot 
convert value of type [java.lang.String] to required type 
[com.azuga.user.manager.UserVehicleMappingVO] for property 
'sharedVehicle[0]':

请帮忙......

最佳答案

您是否已注册此示例中提到的模块 http://www.baeldung.com/jackson-deserialization

        ObjectMapper mapper=new ObjectMapper();
        SimpleModule module = new SimpleModule();

        module.addDeserializer(Set.class, new SharedUserDeserializer());
        mapper.registerModule(module);

它对我有用:

    @Test
    public void test() throws IOException {

        ObjectMapper mapper=new ObjectMapper();
        SimpleModule module = new SimpleModule();

        module.addDeserializer(Set.class, new SharedUserDeserializer());
        mapper.registerModule(module);
       TestUser user=new TestUser();

    Set<UserVehicleMappingVO> sets=new HashSet<>();

    sets.add(new UserVehicleMappingVO("test1"));
    user.setVechicles(sets);

    String jsonString=mapper.writeValueAsString(user);
    Set<UserVehicleMappingVO> vechiles=mapper.readValue(jsonString, new TypeReference<Set<UserVehicleMappingVO>>() {
    });

}

型号:

public class TestUser {

    @JsonDeserialize(using = SharedUserDeserializer.class)
    private Set<UserVehicleMappingVO> vechicles;
   //getters and setters 
}

public class UserVehicleMappingVO {

    private String name;

//getters and setters 

}

自定义反序列化器类:

public class SharedUserDeserializer extends JsonDeserializer<Set<UserVehicleMappingVO>> {

@Override
public Set<UserVehicleMappingVO> deserialize(JsonParser paramJsonParser,
        DeserializationContext paramDeserializationContext)
        throws IOException, JsonProcessingException {
    try {
        System.out.println("hello");
        Set<UserVehicleMappingVO> list = new ObjectMapper().readValue(paramJsonParser.toString(),
                new TypeReference<Set<UserVehicleMappingVO>>() {});
        return list;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return new HashSet<>();
}

回应:

Output {"vechicles":[{"name":"test1"}]}
hello

自定义 HttpMessageConverters :

@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
 MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
 ObjectMapper objectMapper = new ObjectMapper();
 SimpleModule module = new SimpleModule();

            module.addDeserializer(Set.class, new SharedUserDeserializer());
            objectMapper.registerModule(module);

 jsonConverter.setObjectMapper(objectMapper);
 return jsonConverter;
}

引用这里:https://dzone.com/articles/customizing

关于java - Jackon 自定义解串器从未调用过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45616600/

相关文章:

android - java.lang.VerifyError : MappingJacksonHttpMessageConverter, 我需要什么 jackson 版本?

java - RestEasy : org. codehaus.jackson.map.JsonMappingException : Can not deserialize instance of java. util.ArrayList out of START_OBJECT token(..)

java - 用Java阻塞帧切换

java - 如何从子类覆盖/扩展内部类?

java - 将特定时间分配给日历

java - bolt 比 http 有什么优势,为什么我们更喜欢 bolt,

java - Spring JPA插入连接表实体时不允许NULL

java - 所有 Java 标准类和方法的简单列表?

java - 在 Roo 2 (RC1) 中覆盖 Controller 方法行为的正确方法是什么?

java - 使用 LocalDateTime 的 Spring 启动项目