Fastjson: 反序列化时继承/多态的问题

Created on 27 Apr 2016  ·  2Comments  ·  Source: alibaba/fastjson

比如我有这样一个继承体系

package com.zoo;

abstract class Animal {
}

class Dog extends Animal {
    private String wang;
}

class Cat extends Animal {
    private String miao;
}

class Cage {
    private int id;
    private Animal animal;
}

当我想反序列化一个JSON字符串,且Animal的具体类型是Dog时,我只能

{
    "id": 1,
    "animal": {
        "@type": "com.zoo.Dog",
        "wang": "wangwang"
    }
}

@type只能用类的full qualified name.
这样的话我不得不把具体实现类的包名暴露出去。

fastxml的做法是

package com.zoo;

@JsonTypeInfo(use = Id.NAME, include = As.EXISTING_PROPERTY)
@JsonSubTypes({ @Type(value = Dog.class), @Type(value = Cat.class) })
abstract class Animal {
}

@JsonTypeName("dog")
class Dog extends Animal {
    private String wang;
}

@JsonTypeName("cat")
class Cat extends Animal {
    private String miao;
}

class Cage {
    private int id;
    private Animal animal;
}

我的JSON串就可以这样写:

{
    "id": 1,
    "animal": {
        "@type": "dog",
        "wang": "wangwang"
    }
}

@type的值是dog,类似一个别名,而不用写类的全路径名。

希望fastjson也能尽快支持这个需求。

Most helpful comment

@wenshao 不想使用注解@JsonTypeInfo、@JsonSubTypes、@JsonTypeName。
是否提供了其他的方式,比如config,或者配置文件?

All 2 comments

已经实现了,看一下文档:https://github.com/alibaba/fastjson/wiki/JSONType_seeAlso_cn 看是否符合你的需求

@wenshao 不想使用注解@JsonTypeInfo、@JsonSubTypes、@JsonTypeName。
是否提供了其他的方式,比如config,或者配置文件?

Was this page helpful?
0 / 5 - 0 ratings