java - 如何使用特定于域的对象填充 DeserializationContext 以便在反序列化期间使用它们?

标签 java json jackson

有两个类ProjectSchemaPageSchema。后者依赖于前者。

class ProjectSchema {}
class PageSchema {
    public PageSchema(ProjectSchema schema) {}
}

这些类代表 JSON 配置文件,并且都有自定义的 JsonDeserializer

class PageSchemaDeserialiser extends JsonDeserializer<PageSchema> {
    @Override
    public PageSchema deserialize(JsonParser parser, DeserializationContext context) {}
}

问题

要在 PageSchemaDeserialiser 中完全初始化 PageSchema 对象,我需要其中的 ProjectSchema 实例。

当我开始将 TreeNode 解析为 PageSchema 时,我构建了一个 ProjectSchema

ProjectSchema projectSchema = ...;
... 
new ObjectMapper().treeToValue(node, PageSchema.class);

我想让解串器知道这一点。我看到 deserialize 方法采用了 DeserializationContext 。我想知道是否能够在那里传递项目架构,以便在页面架构构建期间可用。

问题

这归结为一个问题:

如何使用特定于域的对象填充 DeserializationContext 以便在反序列化期间使用它们?

最佳答案

我花了一些时间才发现 DeserializationContext 包含 InjectableValues 并且我可以通过 ObjectMapper 将它们传入。

ObjectMapper mapper = new ObjectMapper();
mapper.setInjectableValues(new InjectableValues.Std(myMap));

PageSchema schema = mapper.readValue(inputStream, PageSchema.class);

PageSchemaDeserialiser中,我调用

Object myValue = context.findInjectableValue("myKey", null, null);

它解决了问题,但也带来了新问题。我现在应该在我的共享 ObjectMapper 实例中跟踪 InjectableValues

关于java - 如何使用特定于域的对象填充 DeserializationContext 以便在反序列化期间使用它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57628926/

相关文章:

java - 如何与加密的 SQS 队列交互? KMS key 访问不起作用

java - 使用 JSON 转换器的自定义字段扩展 HashMap

java - 使用 CrudRepository 进行延迟加载

java - 数组索引越界二维数组

Java 在 medhot 中返回 ArrayList<MyObject> ,它返回一个接口(interface)的 ArrayList

php - 使用 jQuery 从 PHP 文件返回 JSON 数据

javascript - 将变量转换为 JSON 值名称

java - JsonMappingException : No suitable constructor found for type [simple type, 类 com.fasterxml.jackson.databind.node.ObjectNode]

java - 为什么在扩展类时会出现 ClassCastException?

ios - 无法将数据转换为字符周围的字符串