gpt4 book ai didi

java - Jackson - 将值传递给 JsonDeserializer

转载 作者:行者123 更新时间:2023-12-02 02:00:14 27 4
gpt4 key购买 nike

我有一个现有的类层次结构,如下所示:

public interface Service {
String getId();
String getName();
}

public class FooTask extends AbstractTask {
private final static ObjectMapper JSON_MAPPER = new ObjectMapper();

static {
JSON_MAPPER.registerModule(new SimpleModule().addDeserializer(Result.class, new ResultDeserializer());
}

public FooTask(Service service) {
super(service);
}

@Override public Result call() throws Exception {
InputStream json = <... execute some code to retrieve JSON ...>
Result result = JSON_MAPPER.readValue(json, Result.class);
}

private static class ResultDeserializer {
@Override public Result deserialize(JsonParser parser, DeserializationContext ctx) throws IOException {

//
// Need to access service#getId() down here... but we're in a static nested class
// and I don't know how to access it. Is there some way to pass that info via the DeserializationContext?
//

<... Deserialization logic ...>
}
}
}

我需要在反序列化时将一些信息传递给反序列化器,但我找不到在反序列化时将一些上下文信息传递给反序列化器的方法。这可能吗?如果是这样,怎么办?我不想每次实例化 FooTask 或调用 #call() 方法时都分配一个新的 ObjectMapper。

最佳答案

所以我想出了一个解决方案......不知道它是否是理想的解决方案,但它是一个解决方案 - 基本上我首先创建一个 InjectableValues 实例:

private InjectableValues newInjectableValues() {
return new InjectableValues.Std()
.addValue("providerId", service.getId())
}

然后我从 ObjectMapper 获取一个新的 ObjectReader 实例并使用它来执行反序列化:

JSON_MAPPER.reader(newInjectableValues()).withType(Result.class).readValue(inputStream)

在实际的反序列化器中,我使用此方法来检索 InjectableValues 提供的值:

ctx.findInjectableValue("providerId", null, null);

关于java - Jackson - 将值传递给 JsonDeserializer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26879286/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com