Передача строкового значения Джексона Пользовательского десериализатор в Java

Я создал пользовательский десериализатор Jackson для десериализации строки JSON:

public class TestMapper extends StdDeserializer<Test> {

    public TestMapper() {
        this(null);
    }

    public TestMapper(Class<?> vc) {
        super(vc);
    }

    @Override
    public Test deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {

Я хочу передать «String аргумент» для метода десериализации, что я хочу использовать во время десериализации. Есть ли способ сделать это?

Я вызываю десериализатор в своем коде следующим образом:

new ObjectMapper().readValue(json, Test.class)

и класс Тест:

@JsonDeserialize(using = TestMapper.class)
public class Test {

person apandey    schedule 06.03.2019    source источник
comment
вы можете передать любой аргумент в конструктор   -  person Sharon Ben Asher    schedule 06.03.2019
comment
@SharonBenAsher -- я вызываю дегерализатор следующим образом: new ObjectMapper().readValue(json, Test.class) и тестовый класс имеет аннотацию @JsonDeserialize(using = TestMapper.class). Как я могу передать значение в новом ObjectMapper (). ReadValue (JSON, Test.class) с помощью конструктора?   -  person apandey    schedule 06.03.2019
comment
вы можете зарегистрировать десериализатор программно. см. ответ на этот stackoverflow.com/questions/6553051/< / а>   -  person Sharon Ben Asher    schedule 06.03.2019
comment
Если добавить конструктор общественного TestMapper (тест String) {}, я получаю сообщение не существует конструктор по умолчанию не доступен для суперкласса.   -  person apandey    schedule 06.03.2019
comment
@SharonBenAsher, добавление общедоступного TestMapper(String test) {super(Test.class);this. тест = тест;} сработало. Спасибо за помощь!   -  person apandey    schedule 06.03.2019


Ответы (1)


Вам нужно создать конструктор, который принимает ваш дополнительный аргумент, который будет использоваться во время десериализации:

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.StdDeserializer;
import com.fasterxml.jackson.databind.module.SimpleModule;

import java.io.IOException;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        SimpleModule customModule = new SimpleModule();
        customModule.addDeserializer(Test.class, new TestMapper("Extra value!!!"));

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

        Test test = new Test();
        test.setValue("Value");

        String json = mapper.writeValueAsString(test);
        System.out.println(json);
        System.out.println(mapper.readValue(json, Test.class));
    }
}

class TestMapper extends StdDeserializer<Test> {

    private String extraConfig;

    public TestMapper() {
        this(null);
    }

    public TestMapper(String extraConfig) {
        super(Test.class);
        this.extraConfig = extraConfig;
    }

    @Override
    public Test deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
        Test test = new Test();
        test.setValue(extraConfig);

        return test;
    }
}

class Test {

    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return "Test{" +
                "value='" + value + '\'' +
                '}';
    }
}

Приведенный выше код печатает:

{"value":"Value"}
Test{value='Extra value!!!'}

Вы всегда должны обеспечить super constructor вашего POJO class, например, Test.class. Если вам нужна более сложная инициализация, посмотрите на _ 8_.

Также взгляните:

person Michał Ziober    schedule 06.03.2019