2017-05-06 5 views

答えて

0

、あなたが直接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); 
} 
0

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 Baseclass RoomDetail extends Baseを言うし、次に試みることができGsonBuilderJsonDeserializer<Base>実装を登録していますBaseインスタンスの実際のタイプを検出します。その後あなたが行うことができます:

gson.fromJson(jsonSource, Base.class); 

もっと見る:

関連する問題