2013-05-10 66 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