バイト配列からJSON文字列を解析し、それをオブジェクトとしてキャストしています。どのようにGSONの解析からオブジェクトのクラスを決定する?
どのようにしてオブジェクトのクラスを決定できますか?
Object objDeserialized = gson.fromJson(jsonFromString, Object.class);
//It could be type Message or RoomDetail
バイト配列からJSON文字列を解析し、それをオブジェクトとしてキャストしています。どのようにGSONの解析からオブジェクトのクラスを決定する?
どのようにしてオブジェクトのクラスを決定できますか?
Object objDeserialized = gson.fromJson(jsonFromString, Object.class);
//It could be type Message or RoomDetail
、あなたが直接Gsonクラスの代わりにJSONを解析するGson libにからJsonParserを使用することができます解析するJSONの種類がわからない場合。例えば
JsonParser parser = new JsonParser(jsonFromString);
JsonObject obj = parser.parse().getAsJsonObject();
作成したJsonObjectのプロパティを確認して、その内容を確認できます。例えば
if (obj.has("somePropertyNameIKnownIsAMemberOfRoomDetail")) {
RoomDetail roomDetail = gson.fromJson(jsonFromString, RoomDetail.class);
} else {
Message message = gson.fromJson(jsonFromString, Message.class);
}
gson.fromJson(jsonFromString、Object.classを)。
一般に、これはObject.class
のために機能しません。
// built-in type adapters that cannot be overridden
factories.add(TypeAdapters.JSON_ELEMENT_FACTORY);
factories.add(ObjectTypeAdapter.FACTORY);
// the excluder must precede all adapters that handle user-defined types
factories.add(excluder);
// user's type adapters
factories.addAll(typeAdapterFactories);
あなたがObject.class
を使用したい場合、あなたはどちらかに結果をキャストする必要があります:Gsonは(Gson 2.8.0のようおそらくずっと以前のプライマリGson
コンストラクタを参照してください)Object
クラスの直列化復元をオーバーライドしてObjectTypeAdapter
を使用禁止しますプリミティブラッパーnull
またはList<E>
またはMap<K,V>
- あなた自身で何らかの分析を行います。その背後にある理論的根拠は、はの結果クラスを事前に知っていなければなりませんので、適切な非直列化オブジェクトを取得していることを確認してください。
ここでの最善の策は、カスタムの親のスーパータイプを作る(それはクラスまたはインタフェースだ場合は本当に重要ではありません)、class Message extends Base
とclass RoomDetail extends Base
を言うし、次に試みることができGsonBuilder
にJsonDeserializer<Base>
実装を登録していますBase
インスタンスの実際のタイプを検出します。その後あなたが行うことができます:
gson.fromJson(jsonSource, Base.class);
もっと見る: