0

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つの質問:

  1. このようにオブジェクトを使用することは良い習慣です。フィールド(データ)に入るタイプ間には関係がないため、インターフェースが実行可能かどうかはわかりません。

  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でジェネリックを使用する

4

3 に答える 3

1

このように使用しない理由Map:

public static class Person {
    String name;
    Map data;        //Placeholder for custom type
}

Mapjsonと互換性があります。

于 2013-01-29T07:04:58.757 に答える
0

このようにオブジェクトを使用することは良い習慣です。フィールド (データ) に入る型の間には関係がないため、インターフェイスが実行可能かどうかはわかりません。

いいえ、ジェネリックを使用してください。

最後にエラーをスローします。おそらく、Gson が基になる型を把握できないためです。

また、ジェネリックを使用して回避します。

于 2013-01-29T06:55:06.827 に答える
0

私はそれを(Gsonからの)JsonElementとして保持しています。これは正しいタイプにアンマーシャリングします。

于 2013-02-05T12:56:58.070 に答える