2

JSON の大きな応答を解析するためにGoogle gson-2.2.1ライブラリを使用しています。

構造が異なる可能性がある JSON 応答を解析する必要があります。

最初のケース、応答に複数のチームが含まれる場合:

 "Details":{

           "Role":"abc",
           "Team":[
              {
                 "active":"yes",
                 "primary":"yes",
                 "content":"abc"
              },
              {
                 "active":"yes",
                 "primary":"yes",
                 "content":"xyz"
              }
           ],

2 番目のケース、1 つのチームのみが合格した場合:

"Details":{

           "Role":"abc",
           "Team":
              {
                 "active":"yes",
                 "primary":"yes",
                 "content":"abc"
              }
}

解析に使用される基本クラスがあります。

class Details {
    public String Role;
    public ArrayList<PlayerTeams> Team = new ArrayList<PlayerTeams>();
        PlayerTeams Team; // when JsonObject
}

class PlayerTeams {
    public String active;
    public String primary;
    public String content;
}

ArrayList<PlayerTeams>問題は、それらが 1 つしかなく、JsonObject として返された場合に使用できないことです。

Gson は、JSON 応答の静的な形式を識別できます。「Team」キーがJsonArrayorのインスタンスであるかどうかを確認することで、完全な応答を動的に追跡できますJsonObjectが、そのためのより良い解決策があれば素晴らしいと思います。

編集: 私の応答がより動的な場合..

"Details":{

       "Role":"abc",
       "Team":
          {
             "active":"yes",
             "primary":"yes",
             "content":"abc"
             "Test":
             {
                 "key1":"value1",
                 "key2":"value2",
                 "key3":"value3"
             }
          }
}

私の編集された質問では、応答がより動的である間に問題に直面しています..また、または..データが増えるTeamとオブジェクトが配列する場合があり、単一のデータの場合はオブジェクトが、データがない場合は文字列になることがあるため、本当に嫌がらせを受けています。対応に一貫性がない。TestJsonArrayJsonObjectTest

4

1 に答える 1

1

タイプアダプターが必要です。このアダプターは、どの形式が来るかを識別し、適切なオブジェクトを適切な値でインスタンス化することができます。

これは次の方法で実行できます。

  1. を実装するクラスを作成して、独自の型アダプターを実装します。JsonSerializer<List<Team>>, JsonDeserializer<List<Team>>もちろん、JsonSerializerそれもシリアル化する必要がある場合にのみ必要です。
  2. 型アダプターを好きGsonBuilderなように登録します。new GsonBuilder().registerTypeAdapter(new TypeToken<List<Team>>() {}.getType(), new CoupleAdapter()).create()

逆シリアル化メソッドは次のようになります。

public List<Team> deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context)
        throws com.google.gson.JsonParseException {
    if (json.isJsonObject()) {
        return Collections.singleton(context.deserialize(json, Team.class));
    } else {
        return context.deserialize(json, typeOfT);
    }
}
于 2012-07-21T12:28:07.937 に答える