【问题标题】:Passing String value to Jackson Custom Deserializer in Java将字符串值传递给 Java 中的 Jackson 自定义反序列化器
【发布时间】:2019-07-28 10:20:12
【问题描述】:

我创建了一个 Jackson Custom Deserializer 来反序列化 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 {

我想将“字符串参数”传递给我想在反序列化期间使用的反序列化方法。有没有办法做到这一点?

我在我的代码中按如下方式调用反序列化器:

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

测试类是:

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

【问题讨论】:

  • 你可以在构造函数中传递任何参数
  • @SharonBenAsher - 我将解封器称为如下 - new ObjectMapper().readValue(json, Test.class) 并且测试类具有 @JsonDeserialize(using = TestMapper.class) 注释.如何使用构造函数传递 new ObjectMapper().readValue(json, Test.class) 中的值?
  • 您可以通过编程方式注册反序列化程序。看到这个stackoverflow.com/questions/6553051/…的答案@
  • 如果我添加构造函数 public TestMapper(String test) { },我会收到消息没有可用于超类的默认构造函数。
  • @SharonBenAsher,添加 public TestMapper(String test) {super(Test.class);this.测试 = 测试;} 工作。感谢您的帮助!

标签: java json jackson jackson2


【解决方案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!!!'}

您应该始终将您的POJO class 提供给super constructor,例如Test.class。如果您需要更复杂的初始化,请查看ContextualDeserializer

另外,看看:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-12
    • 2023-03-22
    • 2016-02-13
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    相关资源
    最近更新 更多