我需要制作一个容器对象,其中一个字段充当占位符。
public static class Person {
String name;
Object data; //Placeholder for custom type
}
此容器类型(Person)用于发送 json 数据,该数据被反序列化,如下面的代码所示。
import com.google.gson.Gson;
public class Main {
public static class Address {
String city;
public Address(String city) {
this.city = city;
}
}
public static class Person {
String name;
Object data; //Placeholder for custom type
public Person(String name, Object data) {
this.name = name;
this.data = data;
}
}
public static void main(String[] args) {
Address addr = new Address("BBB") ;
Person person = new Person("AAA", addr);
Gson gson = new Gson();
String json = gson.toJson(person);
System.out.println("json = " + json);
Person person2 = gson.fromJson(json, Person.class);
System.out.println("person2 name = " + person2.name);
System.out.println("person2 address = " + person2.data);
Address addr2 = (Address) person2.data;
System.out.println("address city = " + addr2.city);
}
}
2个问题:
以这种方式使用 Object 是一个好习惯。类型之间没有关系进入字段(数据),因此不确定接口是否可行。
它在最后抛出错误。可能是因为,Gson 无法弄清楚底层类型。
json = {"name":"AAA","data":{"city":"BBB"}} person2 name = AAA person2 address = {city=BBB} Exception in thread "main" java.lang.ClassCastException:
java.util.LinkedHashMap 不能在 Main.main(Main.java:33) 处转换为 Main$Address
编辑:
根据下面的答案,使用类名误导了我的问题背后的意图。而不是Person
,假设我想建模一个 webresponse 并调用它Response
。该对象可以是任何类型。
say if you call the API /api/person/1 , you get below response
Response {
String message
Object value //type is Person
}
if you call an API /api/student/2
Response {
String message
Object value //type is Student
}
在我不使用反射的情况下,以任何方式对 Response 对象进行建模,以便它接受任何对象作为值并正确编组到基础类型。匿名类型(没有类型爆炸的一次性类)可能是一个选项,我读到 java 没有。正如一个答案所暗示的那样,不确定如何在这种情况下使用泛型。
基于这个答案,类型擦除可能使其不适合使用泛型。 在 GSON 中使用泛型