Gson

2017-12-25 23 views
0

は、私はクラスA、B、Cのグループを持っているとしましょう、未知のクラスをデシリアライズ:Gson

パブリッククラスA: int型の数。

パブリッククラスB: int number; 文字列アドレス。

パブリッククラスC: int orderNumber;

どのように私はこれらのクラスを含むが、未知の順序(JavaでGsonを使用して)を含むJson文字列を逆シリアル化できますか?例:

{//A 
"number" : 3 
} 
//C 
{ 
"orderNumber": 10 
} 
//B 
{ 
"number" : 5 
"address" : "New York" 
} 
//C 
{ 
"orderNumber": 1 
} 

ありがとうございました!

+0

まず、jsonペイロードを一般的な構造(ジャクソンのJsonNodeなど)に変換してから、どのクラスにキャストするかを決定する必要があります。 –

+0

jsonをハッシュマップとして逆シリアル化できます。 – user1516873

答えて

0

これは汎用フィールドではなく、より複雑なクラスのフィールドが多い場合には一般的にこれを行うための優れた戦略です。

しかし、あなたは非直列化するクラスは、例として、あなたが提供するほど単純であるならば、あなたはZのリストを取得するのかに依存するすべてのこれらのフィールド

@Getter 
public class Z { 
    private Integer orderNumber; 
    private Integer number; 
    private String address; 
} 

を持つクラスを作成しますフィールドがnullであるかどうかnull - 必要に応じて - AB、またはCからZに変更します。

デシリアライズするクラスがより複雑な場合、解析するクラスとは何かを決定する何らかの種類のメカニズムを作成する必要があります。 ABまたはC - - 項目が構築されるだろうuser1516873はあなたが何をクラスにマップに存在するどのような分野で決定する必要がある各項目のようにコメントして

Collection<Map<String,String>> 

を示唆したようにそれは可能性があります。

0

回答者:pirhoさんが言ったように、あなたのクラスはあなたが提供したようにシンプルです。しかし、そうでない場合は、独自のデシリアライザを作成することができます。

public class PayloadJsonDeserializer implements JsonDeserializer { 
    @Override 
    public Object deserialize(JsonElement elm, Type type, JsonDeserializationContext context) throws JsonParseException { 
     // create java objects based on the properties in the json object 
     JsonPrimitive orderNumber = elm.getAsJsonObject().getAsJsonPrimitive("orderNumber"); 
     if(!orderNumber.isJsonNull()) { 
      return new C(orderNumber.getAsInt()); 
     } 

     return null; 
    } 
} 

カスタムデシリアライザをGsonで登録します。

GsonBuilder gsonBuilder = new GsonBuilder() 
        .registerTypeAdapter(PayloadJson.class, new PayloadJsonDeserializer()); 
Gson gson = gsonBuilder.create(); 

jsonを逆シリアル化するために使用します。

gson.fromJson(jsonString, PayloadJson[].class);