2016-05-17 13 views
1

Gsonを使用して解析するのが厄介であるとわかっているJson(フラグメントが表示されている)があります。私はjsonの残りの部分を解析することができます。私が下のjsonフラグメントを読む方法は、オブジェクト型、別の配列型、および文字列型を含むargumentsという配列があります。私はJsonを変更することができません。Gsonを使用した多値型Json配列の解析

誰かがGsonを使用してこれを解析する方法についてのアイデアはありますか?

"arguments": [ 
    { 
     "codes": [ 
      "memberRequest.email", 
      "email" 
     ], 
     "arguments": null, 
     "defaultMessage": "email", 
     "code": "email" 
    }, 
    [], 
    ".*" 
] 
+0

私はGSONに慣れていないので、この質問については分かりませんが、有効なJSONは有効なJSONです。準拠しているパーサーは解析する必要があります。 (また、FWIW、あなたが投稿したものはJSONではなく、むしろ一部のJSONの抜粋であるようです) – JAAulde

+0

はい、そうです。それは抜粋です。それを反映するように質問を更新します。 gsonがこのようなオブジェクトを使用してjsonパラメータをマップできるように、このjsonを表す可能性のあるJavaオブジェクトを想像してみようとしています。しかし、Javaはマルチタイプの配列をサポートしていないので、Object以外の共通の親は存在しません。問題があります(私はそう思います)。しかし、これは一般的なものでなければなりません。 –

答えて

1

Javaの表現にどのようなデータ構造が必要かによって異なります。

オプション1ListまたはList<Object>MyListClassのカスタムデシリアライザと

new Gson().fromJson(JSON, ParentPOJO.class); 

private static class ParentPOJO{ 
    public List<Object> arguments; 
} 

オプション2カスタムMyListClass(Actualy Object sがLinkedHashMapStringArrayListだろう):あなたが選ぶことができる3つのオプションがあります。 where MyListClass extends ArrayListこのようにして、逆シリアル化を行い、オブジェクトの適切なデータ型を選択できます。これによりMyListClass extends ArrayListにはMyClass,ArrayListStringが含まれます。以下のデモ

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配列に同じタイプのオブジェクトが複数ある場合は、デシリアライザでそれらを解決するためのアルゴリズムを用意する必要があります。

関連する問題