2013-05-10 78 views
1

在我正在使用的API中,我將某個部分作爲普通JSON數組而不是普通鍵=>值對接收。它的愚蠢,但這是我必須處理的。按位置對象映射JSONArray

實施例:

{"build":29625,"list": [ 
    [312218505,1000,624437010,21997878697,35228,0,0,0], 
    [186873474,0,0,0,0,-1,0,0] 
    ... 
]} 

的問題越來越谷歌GSON到每個陣列位置到字段映射在正常對象。由於毫不奇怪,沒有任何原生支持,所以我不得不推出我自己的解決方案:每個需要轉換的「請求」實現一個CustomConvert接口,其中有convertToObjects()convertToJson()方法。每個「條目」都有一組帶有@ArrayPosition(number)註釋的字段。轉換方法在兩個列表之間轉換。

由於這是醜陋的,有沒有更好的方法來使用Google GSON甚至是另一個用於Java的JSON庫?

+1

呃,寫一個gson串行器/解串器?你能舉一個你正在收到的JSON的例子嗎? – 2013-05-10 20:35:14

+0

@Brian See編輯。和TMK的串行器/解串器它會搞亂其他東西,返回一個JSONArray – TheLQ 2013-05-10 21:04:14

+0

你不寫一個List /數組 - 你寫一個對象包含一個'build'字段和'List '字段。將參數列表傳遞給MyObject的構造函數,以實例化每個參數並將其添加到List中。 (我假設你的JSON數組中的每個內部數組表示相同類型的對象) – 2013-05-10 21:08:22

回答

2

上述評論的例子,但這是我想要得到的思路。注意我沒有測試過這個或者其他什麼,但是至少它應該把你放在路上,如果你想要走這條路。

class OuterObject { 
    String build; 
    List<InnerObject> objectList = new ArrayList<InnerObject>(); 
} 

class InnerObject { 
    int field1, field2, field3, field4, field5, field6, field7, field8; 

    public InnerObject(int[] params) { 
     // assign params accordingly 
    } 
} 

class MyDeserializer implements JsonDeserializer<OuterObject> { 
    @Override 
    public OuterObject deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException 
    { 
     OuterObject oo = new OuterObject(); 
     JsonObject jo = je.getAsJsonObject(); 

     oo.build = jo.get("build").getAsString(); 
     JsonArray innerObjArrays = jo.getAsJsonArray("list"); 
     for (JsonElement e : innerObjArrays) 
     { 
      JsonArray innerArray = e.getAsJsonArray(); 
      // This is ugly but should give you the gist 
      InnerClass ic = new InnerClass((int[])jdc.deserialize(innerArray, int[].class)); 
      oo.objectList.add(ic); 
     } 

     return oo; 
    } 

} 
+0

謝謝!我不得不調整一些東西(構建應該是'jo.get(「build」)。getAsString()'),但是你提供了一個很好的起點 – TheLQ 2013-05-11 02:01:59