当前位置: 首页 > 面试题库 >

杰克逊对多种类型的反序列化

蓝苗宣
2023-03-14
问题内容

我有一个叫做抽象类Instance,然后两个是实现,UserInstanceHardwareInstance。我遇到的问题是,当我将a的其余端点调用@POST到数据库中时,理想情况下,我希望它像.../rest/soexample/instance/create将实例传递给REST端点的位置一样。如果Instance不是用一个以上的实现来抽象,那就没问题了,但是由于我有2个,所以我得到了一个Jackson.databind错误。

“问题:抽象类型要么需要映射到具体类型,要么具有自定义反序列化器,要么被其他类型信息实例化”

在找到解决方案之后,我找到了一个SO答案,说我可以使用类似以下内容的方法:

@JsonDeserialize(as=UserInstance.class)

但这似乎只有在抽象类的一种实现的情况下才有用。假设我不能两次调用它,因为没有办法让它决定实例的类型。

所以我想知道处理这种情况的最佳方法是什么?我应该创建其他端点吗?喜欢:

.../rest/soexample/userinstance/create
.../rest/soexample/hardwareinstance/create

尽管我积极尝试学习,但我不太确定,因为我是与REST相关的noobie。谢谢!


问题答案:

这是我在相同情况下所做的:

@JsonDeserialize(using = InstanceDeserializer.class)
public abstract class Instance {
    //.. methods
}

@JsonDeserialize(as = UserInstance.class)
public class UserInstance extends Instance {
    //.. methods
}

@JsonDeserialize(as = HardwareInstance.class)
public class HardwareInstance extends Instance {
    //.. methods
}

public class InstanceDeserializer extends JsonDeserializer<Instance> {
    @Override
    public Instance deserialize(JsonParser jp,  DeserializationContext ctxt) throws IOException, JsonProcessingException {
        ObjectMapper mapper = (ObjectMapper) jp.getCodec();
        ObjectNode root = (ObjectNode) mapper.readTree(jp);
        Class<? extends Instance> instanceClass = null;
        if(checkConditionsForUserInstance()) {
            instanceClass = UserInstance.class;
        } else { 
            instanceClass = HardwareInstance.class;
        }   
        if (instanceClass == null){
            return null;
        }
        return mapper.readValue(root, instanceClass );
    }
}

您注释Instance@JsonDeserialize(using = InstanceDeserializer.class)指示类可用于反序列化的抽象类。然后,您需要指示每个子类将as自己反序列化,否则它们将使用父类反序列化器,并且您将获得StackOverflowError

最后,在内部,InstanceDeserializer您将逻辑反序列化为一个或另一个子类(checkConditionsForUserInstance()例如)。



 类似资料:
  • 问题内容: 我正在尝试使用Jakson反序列化嵌套的多态类型。意思是我的顶级类型引用了另一个多态类型,该类型最终由不是抽象的类扩展。这不起作用,并引发异常。 这是我要尝试做的简化示例。 我得到有关抽象类型的标准例外。 让我解释一下我的用例。我有一个描述数据工作流程的Json文档。我在“一级”有一个抽象类型,描述了对单个值的操作。我派生了一堆不是抽象的类,它们实现了常见的操作(我用@JsonSubT

  • 问题内容: 我有一个Web服务的结果,该结果返回布尔值或单例映射,例如 布尔结果: 地图结果: 单独地,我可以轻松地映射这两个位置,但是我该如何做呢? 基本上我想将其映射到一个类: 所有所有多态示例都用于基于数据中的属性进行映射,但是在这种情况下,我没有该选项。 编辑 代码的更新部分: 问题答案: 不不不。您不必编写自定义解串器。只需先使用“无类型”映射: 给出“定级” 价值或“定级”价值(采用第

  • 我正在调用一个返回JSON的endpoint,它看起来像这样(在Postman中): 此请求返回的Content-Type头是(与通常的 类来自外部库(编写这个endpoint的人)。无论如何,当我试图通过< code > rest template . exchange()调用这个endpoint时,Jackson都无法将这个JSON反序列化为一个有效的< code>Result类。我正在这样做

  • 问题内容: 我有一个杰克逊问题。 有没有一种方法可以反序列化可能具有两种类型的属性,对于某些对象,它看起来像这样 然后对于其他人则显示为空数组,即 任何帮助表示赞赏! 谢谢! 问题答案: Jackson目前没有内置配置来自动处理这种特殊情况,因此必须进行自定义反序列化处理。 以下是这种自定义反序列化的外观示例。 (您可以使用DeserializationConfig.Feature.ACCEPT_

  • 问题内容: 这是我的Java代码,用于反序列化,我正在尝试将json字符串转换为java对象。为此,我使用了以下代码: 和我的product.java类 我收到以下错误。 帮我解决这个问题 问题答案: 似乎您正在尝试从JSON读取一个实际描述数组的对象。Java对象使用花括号映射到JSON对象,但是您的JSON实际上以方括号指定一个数组开始。 您实际拥有的是一个。为了描述泛型类型,由于Java的类

  • 问题内容: 我有一个JSON字符串,将标记为而不是。因此,例如,如果我有一个没有子对象的对象,我将收到类似以下的字符串: 我想将其反序列化为Parent类,并将子级正确设置为一个空的子级列表。 对于上述JSON字符串,我想要一个对象,其设置为,而设置为。 我会知道如何在整个课堂上使用注释 然后 但是,我想解决一个从字符串正确实例化List的一般问题: 我能得到类似的东西吗? 问题答案: 几个选择;