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

使用Jackson进行动态多态类型处理

仇建茗
2023-03-14
问题内容

我有一个与此类似的类层次结构:

public static class BaseConfiguration {
}

public abstract class Base {
  private BaseConfiguration configuration;
  public String id;

  public BaseConfiguration getConfiguration() { ... }
  public void setConfiguration(BaseConfiguration configuration) { ... }
}

public class A extends Base {
   public static class CustomConfigurationA extends BaseConfiguration {
       String filename;
       String encoding;
   }

   CustomConfigurationA getConfiguration() { ... }
}

class B extends Base {
   public static class CustomConfigurationB extends BaseConfiguration {
       /* ... */
   }

   CustomConfigurationB getConfiguration() { ... }
}

像这样的json输入(我无法改变自己)

{
    "id":"File1",
    "configuration":{
         "filename":"...",
         "encoding":"UTF-8"
     }
}

我正在像这样用Jackson解析Java中的JSON

ObjectMapper mapper = new ObjectMapper();
value = mapper.readValue(in, nodeType);

我想使用JAVA /
Jackson从JSON反序列化类A,B和其他类。JSON中没有嵌入类型信息(并且不能)。我不能在类上使用批注(我不拥有它们),我(相信)我不能使用混合包,因为可能有任意数量的类,例如A和B(混合包不是动态的)。好的是,反序列化代码知道哪个是用于反序列化的正确的自定义类(基本上,从类到配置类都有一个已知的映射),但是我不知道在反序列化JSON时如何使Jackson识别此信息。

简而言之:我希望能够通过设置ObjectMapper所需的内容来根据周围的类类型来解析配置对象的反序列化类型。如何做到这一点?


问题答案:

显然,答案是要实现类似于发布在http://programmerbruce.blogspot.com/2011/05/deserialize-json-
with-jackson-
into.html

的第六种解决方案,该解决方案使用唯一的JSON元素名称来标识目标进行反序列化。



 类似资料:
  • 我有三个从超级类(SensorData)继承的类 我想根据参数将一个json输入转换为其中一个类。我正在尝试使用Jackson StdDeserializer并创建一个自定义的反序列化程序 我的问题是,当我确定映射具体类的正确类型时,映射器再次调用自定义stdDeserializer。所以我需要一种方法来打破循环当我有正确的类型。stacktrace是下一个 输入示例 我只包含stacktrace

  • 问题内容: 如果我有这样的类结构: 还有另一种反序列化的方法吗?在父类上使用此注释: 我不想强迫我的API的客户包括反序列化一个子类。 杰克逊不是使用,而是提供了一种方法来注释子类并通过唯一属性将其与其他子类区分开来?在上面的示例中,这类似于“如果JSON对象将其反序列化为,如果它将其反序列化为”。 问题答案: 感觉像是应该使用的东西,但是我在文档中进行了选择,可以提供的任何属性似乎都不符合您所描

  • 我使用@JsonTypeInfo和@JsonSubTypes来映射基于给定属性的解析子类。下面是我想要解析的示例JSON的一个人为示例。 用这个作为课堂 但是,当JSON包含我想要忽略的类型时,就会出现问题。例如,如果我有一个新类型的“猪”,我真的不想反序列化为对象: 并尝试解析它,它会给我这个错误: 无法将类型id猪解析为[简单类型,类动物]的子类型 我如何修复它,这样我就可以只绘制那些“狗”和

  • 我看过jackson反序列化@JsonTypeInfo的一个例子,那就是: 我试过了,效果很好。现在的问题是,在示例类中,Cat和Dog是从Animal中引用的,我想避免这种情况。有没有一种方法可以将类型绑定从类动物中移除,并且仍然进行反序列化工作?谢谢

  • 我想使用jackson注释反序列化2级多态子类型。基本上,我想使用json注释和jacksons将以下json转换为xml,如下所示 我想要的最终Xml是 我有以下几门课——主课 它具有抽象子类 MySubItem有具体的子类,比如MySubItemA、MySubItemB和MySubItemC 最后,我们创建一个客户端类,它包含抽象类的对象列表 我尝试为我的项目创建 Mixin 类作为 和for

  • 动态类型(dynamic typing)是Python另一个重要的核心概念。我们之前说过,Python的变量(variable)不需要声明,而在赋值时,变量可以重新赋值为任意值。这些都与动态类型的概念相关。 动态类型 在我们接触的对象中,有一类特殊的对象,是用于存储数据的。常见的该类对象包括各种数字,字符串,表,词典。在C语言中,我们称这样一些数据结构为变量。而在Python中,这些是对象。 对象