通过 SpringMVC 调用接口时会自动对返回结果进行多态序列化,但是我自己使用 fastjson 和 gson 的时候并不会进行多态序列化,想问下大佬们,我应该怎么实现 Java 对象的多态序列化?
喜欢能用代码展示
通过 SpringMVC 调用接口时会自动对返回结果进行多态序列化,但是我自己使用 fastjson 和 gson 的时候并不会进行多态序列化,想问下大佬们,我应该怎么实现 Java 对象的多态序列化?
喜欢能用代码展示
在 Java 中实现 JSON 的多态序列化确实需要一些额外的配置,特别是对于像 fastjson
和 gson
这样的库。下面是针对这两个库的解决方案。
fastjson
实现多态序列化fastjson
提供了 @JSONType
注解来处理多态序列化。你需要指定 @JSONType(reference = YourBaseClass.class)
注解在你的子类上,并且需要在父类上使用 @TypeName
注解来指定类型名称。
以下是一个示例:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONType;
import com.alibaba.fastjson.annotation.TypeName;
@TypeName("animal")
class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
// getters and setters
}
@JSONType(reference = Animal.class)
class Dog extends Animal {
private String breed;
public Dog(String name, String breed) {
super(name);
this.breed = breed;
}
// getters and setters
}
@JSONType(reference = Animal.class)
class Cat extends Animal {
private boolean isScratchy;
public Cat(String name, boolean isScratchy) {
super(name);
this.isScratchy = isScratchy;
}
// getters and setters
}
public class Main {
public static void main(String[] args) {
Animal dog = new Dog("Buddy", "Golden Retriever");
Animal cat = new Cat("Whiskers", true);
String dogJson = JSON.toJSONString(dog, SerializerFeature.PrettyFormat);
String catJson = JSON.toJSONString(cat, SerializerFeature.PrettyFormat);
System.out.println("Dog JSON: " + dogJson);
System.out.println("Cat JSON: " + catJson);
}
}
在这个例子中,Dog
和 Cat
类都使用了 @JSONType(reference = Animal.class)
注解,而 Animal
类使用了 @TypeName("animal")
注解。这允许 fastjson
在序列化时正确处理多态。
gson
实现多态序列化gson
处理多态序列化稍微复杂一些,你需要使用 RuntimeTypeAdapterFactory
。以下是一个示例:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.TypeAdapter;
import com.google.gson.reflect.TypeToken;
import com.google.gson.typeadapters.RuntimeTypeAdapterFactory;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
// getters and setters
}
class Dog extends Animal {
private String breed;
public Dog(String name, String breed) {
super(name);
this.breed = breed;
}
// getters and setters
}
class Cat extends Animal {
private boolean isScratchy;
public Cat(String name, boolean isScratchy) {
super(name);
this.isScratchy = isScratchy;
}
// getters and setters
}
public class Main {
public static void main(String[] args) {
Gson gson = new GsonBuilder()
.registerTypeAdapterFactory(RuntimeTypeAdapterFactory.of(Animal.class)
.registerSubtype(Dog.class)
.registerSubtype(Cat.class))
.create();
Animal dog = new Dog("Buddy", "Golden Retriever");
Animal cat = new Cat("Whiskers", true);
String dogJson = gson.toJson(dog);
String catJson = gson.toJson(cat);
System.out.println("Dog JSON: " + dogJson);
System.out.println("Cat JSON: " + catJson);
}
}
在这个例子中,我们使用 RuntimeTypeAdapterFactory
来注册 Animal
的子类型 Dog
和 Cat
。这允许 gson
在序列化时正确处理多态。
这两种方法都可以帮助你实现 Java 对象的多态序列化。根据你的具体需求选择合适的库和方法。
15 回答7k 阅读
2 回答3.3k 阅读✓ 已解决
3 回答7.1k 阅读✓ 已解决
5 回答4.7k 阅读
3 回答5.2k 阅读
4 回答2.4k 阅读
2 回答2.3k 阅读✓ 已解决
1.创建基类和注解
BasePolymorphicObject.java
2.创建序列化工具类
PolymorphicSerializationUtil.java
3.自定义异常类
SerializationException.java
4.示例使用
Dog.java
Cat.java
Example.java
Gson 序列化和反序列化示例
序列化结果:
反序列化结果:
Fastjson 序列化和反序列化示例
序列化结果:
反序列化结果: