`
dwangel
  • 浏览: 265831 次
社区版块
存档分类
最新评论

Jackson多态处理的不在父类里进行子类声明的方法

 
阅读更多
有个需求,使用在json化后,type属性记录一个自定义的类型id
然后,反序列化时,根据这个ID自动翻译成实际类。

Jackson例子是直接在Base class上用annotation声明
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class")
class Animal { } 


但是没说明如何声明子类。Jackson本身没有提供自动搜索类并自注册的功能。
http://wiki.fasterxml.com/JacksonPolymorphicDeserialization
查了半天文档,和实验,用如下声明是可以的
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class")
@JsonSubTypes(
  @JsonSubTypes.Type(name="dog",value=Dog.class),
  @JsonSubTypes.Type(name="cat",value=Cat.class),
  )
class Animal { } 


但我希望 这个关系能不在Base类上声明,就是不使用@JsonSubTypes。

看源码,找文档,找到mapper.有一个方法
:registerSubtypes。
尝试了,但是无效。

后来突然想到,我只注册了子类,是不是也要把基类(base)也注册进去?

尝试了一下,成功……
函数名明明是registerSubtype啊 [晕]

ObjectMapper mapper = new ObjectMapper();
mapper.registerSubtypes(Animal.class);
mapper.registerSubtypes(new NamedType(Dog.class,"dog"));
mapper.registerSubtypes(new NamedType(Cat.class,"cat"));



jackson版本1.9.6
0
0
分享到:
评论
2 楼 dwangel 2013-01-21  
canky 写道
mapper.registerSubtypes(new NamesType(Dog.class,"dog"));

NamesType 没找到,是NamedType吧?

org.codehaus.jackson.map.jsontype.NamedType

你说的对,我弄错了。
1 楼 canky 2013-01-21  
mapper.registerSubtypes(new NamesType(Dog.class,"dog"));

NamesType 没找到,是NamedType吧?

org.codehaus.jackson.map.jsontype.NamedType

相关推荐

    jacksonjar_jb51

    6. `@JsonSubTypes`, `@JsonTypeInfo`: 对于多态类型,这些注解可以指导Jackson如何处理子类和父类的关系。 在提供的"使用说明- jar包.txt"文件中,可能会包含更详细的使用指南,如如何将Jackson库集成到项目中,...

    学习JAVA的三十个基本概念

    方法覆盖发生在子类中,重写父类中的同名方法。 12. 泛型:泛型提供了编译时类型安全,用于创建可以处理多种类型的集合和方法。 13. 注解:注解是元数据,提供了一种向编译器或JVM提供信息的方式,如用于运行时...

    jackson-array-shape-tc:Jackson 阵列形状问题的测试用例

    描述中提到的"自定义类型 id 序列化程序"是指Jackson的`@JsonTypeInfo`和`@JsonSubTypes`注解,它们允许我们在序列化和反序列化时处理多态类型。`@JsonTypeInfo`定义了如何标识和区分不同的子类,而`@JsonSubTypes`...

    《信息系统分析与设计》考试复习材料汇总

    - 继承:子类可以继承父类的属性和方法,实现代码复用。 - 抽象:提取事物的关键特征,忽略非本质细节。 - 结构化技术:采用自顶向下、逐步细化的设计,以顺序、选择、循环三种基本控制结构构建程序,确保单一...

    rpg.java:用 Java 编写的基于文本的 RPG

    - **继承与多态**:利用继承可以创建类似但有差异的对象,多态则允许使用父类引用指向子类实例,提高代码的可扩展性和复用性。 - **封装**:隐藏对象内部细节,仅对外提供公共接口进行交互,以保护数据安全。 5. ...

    软件工程模拟试题

    - 继承性:面向对象特性,子类可以继承父类的属性和方法。 2. **填空题** - 软件生存周期模型描述了软件开发的各个阶段和活动的顺序。 - 软件配置评审应在交付前进行,确保文档的正确性和一致性。 - 可行性研究...

    json-subclass

    例如,你可以创建一个通用的`JsonSubclassConverter`,它能识别并处理多态对象,通过检查JSON中的特定字段(如类型标识符)来确定应该反序列化为哪个子类。 标签“Java”明确了这个话题是关于Java编程的,这包括...

    Java基础及相关jar包和jQuery

    - **AJAX**:jQuery提供了简便的方法进行异步请求。 ##### 3. jQuery高级特性 - **动画效果**:通过`.animate()`方法可以轻松实现复杂的动画效果。 - **插件扩展**:jQuery社区提供了大量的插件,可以轻松实现复杂...

    JavaExercise

    封装用于隐藏实现细节,继承允许子类继承父类的属性和方法,多态则允许使用父类引用操作子类对象。 - **控制结构**:包括条件语句(if-else,switch-case)和循环(for,while,do-while)等,这些都是编写逻辑代码...

    java实用100例 60-100

    80.多态:多态是面向对象的核心概念,示例可能涵盖子类继承父类的方法和属性,以及接口的实现。 81-100. 其他:剩余的示例可能涵盖Java语言的更多方面,如并发工具类、国际化、NIO(非阻塞I/O)、JNDI(Java Naming...

    2021-2022年收藏的精品资料软件工程试卷.doc

    继承性是面向对象编程中的一个概念,允许子类继承父类的属性和方法,从而实现代码的重用和扩展。 【状态图】 状态图用于描述对象在其生命周期中的各种状态以及状态之间的转换,是面向对象设计中用来理解对象行为的...

    关于java知识结构图

    继承允许一个类(子类)从另一个类(父类)继承属性和方法,实现代码复用。多态则指同一消息可以被不同对象响应,增强了程序的灵活性。 4. **异常处理**:Java提供了异常处理机制,通过try-catch-finally语句块捕获...

    java核心技术源代码

    - 继承与多态:Java支持单继承和多态性,源码中会有子类继承父类、方法重写和接口实现的例子。 - 封装:源代码将展示如何使用访问修饰符(public, private, protected)来封装数据,以及如何通过getter和setter...

    java 版通讯录(文件)

    - 单元测试:使用JUnit等工具对`Contact`类和通讯录操作方法进行单元测试,确保代码的正确性。 综上所述,这个Java版通讯录项目不仅涉及基础的面向对象编程,还涵盖了文件操作、数据结构、异常处理等多个重要领域...

    软件工程复习题.pdf

    22. **面向对象的特性**:继承、多态和封装是面向对象编程的核心特性,其中继承是子类共享父类特性的机制。 23. **软件生存周期**:涵盖从需求定义到软件报废的全部时间,包括问题定义、可行性研究、需求分析、设计...

    基于c++的一个简单的图书管理系统.zip

    2. 继承:通过继承机制,子类可以扩展父类的功能,如管理员类可能继承自用户类,增加管理权限相关的方法。 3. 多态:多态性允许不同的对象对同一消息作出不同的响应,如“借阅”操作在图书和读者类中可能有不同的...

    JimoWeather:一个简单的天气应用

    2. 继承与多态:Java支持面向对象的特性,JimoWeather可能使用了Activity和Service的子类,继承了父类的功能并扩展了自己的特有方法。多态则体现在接口的使用上,允许不同的类实现同一接口,提供统一的调用方式。 3...

    FCI_sw1_project_2020

    3. **继承与多态**:Java支持单继承和多重接口实现,通过继承可以扩展已有类的功能,多态则允许子类对象替换父类对象,提供灵活性。 4. **异常处理**:Java的异常处理机制使得程序能优雅地处理错误,通过try-catch-...

    Be-a-Starboy:oop课程项目

    - 继承(Inheritance):子类继承父类的特性,可以扩展或修改父类的行为。 - 多态(Polymorphism):同一种行为可以有不同的表现形式,比如方法重写和接口实现。 2. **类设计**: - 属性:定义对象的状态,如...

Global site tag (gtag.js) - Google Analytics