1つのフィールドがプレースホルダーとして機能するコンテナーオブジェクトを作成する必要があります。
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つの質問:
このようにオブジェクトを使用することは良い習慣です。フィールド(データ)に入るタイプ間には関係がないため、インターフェースが実行可能かどうかはわかりません。
最後にエラーをスローします。おそらく、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
、Web応答をモデル化してそれを呼び出したいとしましょう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にはありません。1つの答えが示唆しているように、このコンテキストでジェネリックを使用する方法がわかりません。
この回答に基づいて、型消去はジェネリックスの使用に適さない可能性があります。 GSONでジェネリックを使用する