Gsonユーザーガイドはこれを明示的にカバーしています:
https://sites.google.com/site/gson/gson-user-guide#TOC-Serializing-and-Deserializing-Collection-with-Objects-of-Arbitrary-Types
tr
任意の型を含む配列であるフィールドを持つオブジェクトがあります。
ユーザーガイドでは、このような構造を直接逆シリアル化することはできないと説明されており、次のことをお勧めします。
GsonのパーサーAPI(低レベルストリーミングパーサーまたはDOMパーサーJsonParser)を使用して配列要素を解析してから、各配列要素でGson.fromJson()を使用します。これが推奨されるアプローチです。
あなたの場合...それは実際にはその配列でどのオブジェクトが可能であったかに依存します。それらがすべて同じ内部オブジェクトを持っている場合は、次のようなことをしたいと思います...
List<MyUserPojo> list = new ArrayList<MyUserPojo>();
JsonArray array = parser.parse(json).getAsJsonObject().getAsJsonArray("tr");
for (JsonElement je : array)
{
Set<Map.Entry<String,JsonElement>> set = je.getAsObject().entrySet();
JsonElement je2 = set.iterator().next().getValue();
MyUserPojo mup = new Gson().fromJson(je2, MyUserPojo.class);
list.add(mup);
}
tr
そしてもちろん、これは、フィールドを持つ実際のオブジェクトのカスタムデシリアライザー内にある必要がありresults
ます。
class MyPojo
{
List<MyUserPojo> userList;
int results;
}
class MyUserPojo
{
String userId;
String address;
}
class MyDeserializer implements JsonDeserializer<MyPojo>
{
@Override
public MyPojo deserialize(JsonElement je, Type type, JsonDeserializationContext jdc)
throws JsonParseException
{
List<MyUserPojo> list = new ArrayList<MyUserPojo>();
JsonArray array = je.getAsJsonObject().getAsJsonArray("tr");
for (JsonElement je2 : array)
{
Set<Map.Entry<String,JsonElement>> set = je2.getAsObject().entrySet();
JsonElement je3 = set.iterator().next().getValue();
MyUserPojo mup = new Gson().fromJson(je3, MyUserPojo.class);
list.add(mup);
}
MyPojo mp = new MyPojo();
mp.tr = list;
mp.results = je.getAsObject().getAsJsonPrimitive("results").getAsInt();
return mp;
}
}
これですべての設定が完了しました。そのデシリアライザーを使用して、オブジェクトを作成できます。
Gson gson = new GsonBuilder()
.registerTypeAdapter(MyPojo.class, new MyDeserializer())
.build();
MyPojo mp = gson.fromJson(json, MyPojo.class);
a
、などが重要な場合b
...まあ、あなたはそれを理解する必要があります。しかし、上記のことで、JSON構造を処理するために何が必要になるかを理解することができます。
完全を期すために、これを回避する唯一の「ハッキー」な方法は、これらのタイプの数がかなり限られており、内部オブジェクトもそのフィールドに関してかなり制限されている場合です。すべての可能性を網羅するPOJOを作成できます。
class MyPojo
{
MySecondPojo a;
MySecondPojo b;
...
MySecondPojo f;
}
class MySecondPojo
{
String userId;
String address;
...
String someOtherField;
}
GsonがJSONを逆シリアル化すると、POJOで欠落しているフィールドがすべてに設定されますnull
。これで、POJOにこれらの配列を含めるtr
ことができます。List
繰り返しになりますが、これは非常にハッキーで間違った方法ですが、その配列を直接解析するために何が必要になるかを説明したいと思いました。