我需要创建一个容器对象,其中一个字段充当占位符。
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 个问题:
以这种方式使用对象是一个很好的实践。进入字段(数据)的类型之间没有关系,因此不确定接口(interface)是否可行。
最后会抛出错误。可能是因为,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$Address 在Main.main(Main.java:33)
编辑:
根据下面的答案,类名的使用误导了我的问题背后的意图。假设我想对网络响应进行建模并将其命名为 Response
,而不是 Person
。该对象可以是任何类型。
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没有。正如一个答案所建议的那样,不确定如何在这种情况下使用泛型。
根据这个答案,类型删除可能会使它不适合使用泛型。 Using generics with GSON
最佳答案
为什么不使用这样的Map
:
public static class Person {
String name;
Map data; //Placeholder for custom type
}
Map
可以兼容json。
关于java - 使用对象作为通用容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14577227/