Spring JsonDeserializer не работает для типа String - PullRequest
2 голосов
/ 17 марта 2020

У меня есть требование убрать все специальные символы и управляющие символы из полей типа String в любом из объектов. Десериализатор был зарегистрирован, но никогда не выполняется во время выполнения для Strings . Я попытался добавить то же самое, что и аннотация @JsonDeserialize(using = StringProcessorComponent.class), но та же проблема. Это работает для любого другого типа как Date / Long. Пожалуйста, дайте мне знать, если я что-то пропустил.

Вот мой десериализатор.

@JsonComponent
public class StringProcessorComponent extends JsonDeserializer<String> {
    @Override
    public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        JsonToken currentToken = p.getCurrentToken();

        if (currentToken.equals(JsonToken.VALUE_STRING)) {
            String text = MyStringProcessor.clean(p.getValueAsString());
            return text;
        }

        return null;
    }
}

1 Ответ

1 голос
/ 17 марта 2020

Чтобы переопределить десериализаторы по умолчанию, вы можете использовать SimpleModule. Также, если вы хотите расширить реализацию по умолчанию, вы можете расширить десериализаторы по умолчанию. В вашем случае вы можете расширить com.fasterxml.jackson.databind.deser.std.StringDeserializer класс. См. Пример ниже:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.deser.std.StringDeserializer;
import com.fasterxml.jackson.databind.module.SimpleModule;

import java.io.IOException;
import java.util.StringJoiner;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        SimpleModule stringModule = new SimpleModule("String Module");
        stringModule.addDeserializer(String.class, new CustomStringDeserializer());

        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(stringModule);

        String json = "{\"firstName\":\"  Tom \",\"lastName\":\"  Long \"}";

        CustomStringPojo customStringPojo = mapper.readValue(json, CustomStringPojo.class);
        System.out.println(customStringPojo);
    }
}

class CustomStringDeserializer extends StringDeserializer {
    @Override
    public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String text = super.deserialize(p, ctxt);
        //clean up value
        return text.trim();
    }
}

class CustomStringPojo {
    private String firstName;
    private String lastName;

    // getters, setters, toString
}

Над отпечатками кода:

CustomStringPojo{firstName='Tom', lastName='Long'}
...