2016-07-07 20 views
0

これでGsonと解析したいJSONの部分があります。私はStringsを値に、longsをキーにしたいと思います。重複するキーを持つJsonからマップを構成する方法

{ "completed_questions":[[ "文字列"、12345]、...]}

問題であり、データ型、私はそれがすべてを解析しますが、私与えMap<String, Long>をしようとすると、重複したStringキーのためにエラーが発生しました。

私はGsonがそれらを切り替えることを知っていると思っていましたが、私が試したときに、Map<Long, String>私はLongsとして私のStringsを解析できないというエラーがありました。

私はスワップマップクラスを作成しました。スワップマップクラスはキーと値の型を取り入れてスワップします。public class SwapMap<K, V> implements Map<K, V>しかし、put/get/removeのようなスワップマップの動作を変換するのはかなり難しいようです。

文字列が一意ではないのに、Gsonでこれを解析するにはどうすればよいですか? (ただし数字は)

答えて

0

私がしたことは、これらの値をLongSparseArray<String>にマッピングしたカスタムGson Deserializerを作成したことです。これは、これを実行する最善の方法です。

これは、デシリアライザの関連する部分である:

for (JsonElement array : jsonObject.get("my_key").getAsJsonArray()) { 
    if (array.getAsJsonArray().size() == 2) { 
     String value = array.getAsJsonArray().get(VALUE).getAsString(); 
     long key = array.getAsJsonArray().get(KEY).getAsLong(); 
     progress.completedActivities.put(key, value); 
    } 
    } 

は、その後、私はちょうどそのように私のGson作成者にこれを追加しました:

@Provides @Singleton Gson provideGson() { 
return new GsonBuilder() 
    .registerTypeAdapter(MyClass.class, new MyClass()) 
    .create(); 
} 
1

JSONでは、jsonオブジェクト内の同じレベルの同一キーは使用できません。 json配列をJavaマップにマップしようとしているようです。

Gsonが提供するデフォルトの変換を使用する場合は、次のデータ構造に基づいてリストが必要です。

private static void mapToObject() { 
     String json = "{\"completed_questions\":[[\"String\",12345],[\"String\",123456]]}"; 

     Gson gson = new Gson(); 
     CompletedQuestions questions = gson.fromJson(json, CompletedQuestions.class); 

     for (List<String> arr : questions.getCompleted_questions()) { 
      for (String val : arr) { 
       System.out.print(val + " "); 
      } 
      System.out.println(); 
     } 

    } 

    public static class CompletedQuestions { 

     List<List<String>> completed_questions; 

     public List<List<String>> getCompleted_questions() { 
      return completed_questions; 
     } 
    } 

これは出力:ここ

{ 
    "completed_questions": [ 
    [ 
     "String", 
     12345 
    ], 
    [ 
     "String", 
     12345 
    ] 
    ] 
} 

は、迅速な実装です

String 12345 
String 123456 

注意すべき事は、私は密接にデータモデルに似ているマッピングの目的のためにリストを使用していますということです提供されます。

これはあなた自身で長時間変換を行う必要があります。しかし、jsonの文字列が見える方法。あなたが指数を操作する必要があるようです。 JSON構造体を制御できる場合は、より良いモデルを作成することをお勧めします。あなたはlist.get(0) - >あなたのキーlist.get(1) - >あなたの値のような何かを行うことができる他の賢明な内側のリストにlongです。

+0

いや、私はキャストし、リストを使用して心配していました。の指標();このオプションはSwapMapクラスよりもきれいに見えます。 – MrEngineer13

関連する問題