2016-07-07 67 views
0

好的,我有一塊我想用Gson解析的JSON。我希望絃樂是成爲關鍵的價值和長處。如何從具有重複鍵的Json構造一個地圖

{ 「completed_questions」:[ 「字符串」,12345],...]}

的問題是數據類型,當我嘗試Map<String, Long>它解析一切,但給了我一個由於重複的String鍵錯誤。

我試圖扭轉它認爲Gson會知道切換它們,但當我嘗試Map<Long, String>我得到了一個關於不能將我的字符串解析爲長的錯誤。

爲了得到它的工作,我創建了一個交換地圖類,該類使用Key和Value類型並將它們交換爲public class SwapMap<K, V> implements Map<K, V>,但是像put/get/remove那樣轉換交換的地圖操作似乎相當困難。

即使字符串不是唯一的,用Gson解析這個最好的方法是什麼? (但數字是)

回答

0

所以我做了一個定製的Gson解串器,它將這些值映射到LongSparseArray<String>,這是最好的方法。

這是解串器的相關部分:

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提供的默認轉換,您將需要一個列表。

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

這裏是一個快速的實現:

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; 
     } 
    } 

此輸出:

String 12345 
String 123456 

要注意的事情是,我使用映射目的的列表,它非常類似於數據模型提供。

這將需要你做長時間的轉換。但json字符串的樣子。你似乎需要對指數進行操作。如果你能控制json結構,我會建議創建一個更好的模型。其他方面,你可以做一些像list.get(0) - >你的key list.get(1) - >你的值,它是內部列表上的long

+0

是啊,所以我很擔心鑄造和使用名單。指數();爲了搜索,但是這個選項看起來比我的SwapMap類更乾淨。 – MrEngineer13