Javaの表現にどのようなデータ構造が必要かによって異なります。
オプション1List
またはList<Object>
MyListClass
のカスタムデシリアライザと
new Gson().fromJson(JSON, ParentPOJO.class);
private static class ParentPOJO{
public List<Object> arguments;
}
オプション2カスタムMyListClass
(Actualy Object
sがLinkedHashMap
、String
、ArrayList
だろう):あなたが選ぶことができる3つのオプションがあります。 where MyListClass extends ArrayList
このようにして、逆シリアル化を行い、オブジェクトの適切なデータ型を選択できます。これによりMyListClass extends ArrayList
にはMyClass
,ArrayList
、String
が含まれます。以下のデモ
public static void main(String[] args) {
Gson gson = new GsonBuilder().registerTypeAdapter(MyListClass.class, new CustomDeserializer()).create();
map = gson.fromJson(JSON, ParentPOJO.class);
}
private static class ParentPOJO{
public MyListClass arguments;
}
private static class MyListClass extends ArrayList{}
private static class CustomDeserializer implements JsonDeserializer{
@Override
public Object deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
MyListClass list = null;
if (json.isJsonArray()){
list = new MyListClass();
JsonArray array = json.getAsJsonArray();
for(int i = 0; i< array.size();i++){
Object next = parseNext(array.get(i),context);
list.add(next);
}
}
return list;
}
private Object parseNext(JsonElement json, JsonDeserializationContext context){
if (json.isJsonArray()){
return context.deserialize(json, Object.class);//can change object type if you know it
}else if(json.isJsonPrimitive()){
return json.getAsJsonPrimitive().getAsString();
}else if(json.isJsonObject()){
return context.deserialize(json, MyClass.class);
}
return null;
}
}
public class MyClass {
@SerializedName("codes")
private List<String> codes = new ArrayList<String>();
@SerializedName("arguments")
private Object arguments;
@SerializedName("defaultMessage")
private String defaultMessage;
@SerializedName("code")
private String code;
}
オプション3はほとんど同じですが、MyPOJOClass
代わりMyListClass
だけ、デシリアライザを変更するあなたのMyPOJOClass
にフィールドを追加し、デシリアライザでPOJOフィールドにJSON配列をマッピングします。カスタムの3-dオプションを選択した場合、カスタムシリアライザも作成する必要があります
json配列に同じタイプのオブジェクトが複数ある場合は、デシリアライザでそれらを解決するためのアルゴリズムを用意する必要があります。
私はGSONに慣れていないので、この質問については分かりませんが、有効なJSONは有効なJSONです。準拠しているパーサーは解析する必要があります。 (また、FWIW、あなたが投稿したものはJSONではなく、むしろ一部のJSONの抜粋であるようです) – JAAulde
はい、そうです。それは抜粋です。それを反映するように質問を更新します。 gsonがこのようなオブジェクトを使用してjsonパラメータをマップできるように、このjsonを表す可能性のあるJavaオブジェクトを想像してみようとしています。しかし、Javaはマルチタイプの配列をサポートしていないので、Object以外の共通の親は存在しません。問題があります(私はそう思います)。しかし、これは一般的なものでなければなりません。 –