杰克逊 - 将值传递给JsonDeserializer

时间:2014-11-12 04:28:21

标签: java json jackson

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

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。

1 个答案:

答案 0 :(得分:7)

所以我提出了一个解决方案......不知道它是否是理想的解决方案,但它是一个解决方案 - 基本上我首先创建一个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);