我需要创建一个容器对象,其中一个字段充当占位符。
public static class Person {
String name;
Object data; //Placeholder for custom type
}
此容器类型(Person)用于发送json数据,如下面的代码所示,这些数据是de / serialized。
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 $ Address 在Main.main(Main.java:33)
根据以下答案,使用班级名称误导了我的问题背后的意图。不是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没有。一个答案表明,不确定如何在这种情况下使用泛型。
基于此答案,类型擦除可能使其不适合使用泛型。 Using generics with GSON
答案 0 :(得分:1)
为什么不这样使用Map
:
public static class Person {
String name;
Map data; //Placeholder for custom type
}
Map
可与json兼容。
答案 1 :(得分:0)
使用Object这种方式是一种很好的做法。没有关系 类型之间进入字段(数据),所以不确定接口是什么 可行的。
不,使用泛型。
最后抛出错误。可能是因为,Gson无法弄清楚了 基础类型。
另外,请使用泛型来避免。
答案 2 :(得分:0)
我将它保存为JsonElement(来自Gson),然后将其解组为正确的类型。