将JSONArray按位置映射到对象

时间:2013-05-10 20:06:08

标签: java json gson

在我正在使用的API中,我收到某个部分作为普通的JSON数组,而不是普通的密钥=>价值对。它很愚蠢,但这就是我必须要处理的事情。

示例:

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

问题是让Google GSON将每个数组位置映射到普通对象中的字段。由于没有任何本机支持,我不得不推出自己的解决方案:需要转换的每个“请求”都实现了一个具有convertToObjects()convertToJson()方法的CustomConvert接口。每个“条目”都有一堆带有@ArrayPosition(number)注释的字段。转换方法在两个列表之间进行转换。

由于这很难看,有没有更好的方法来使用Google GSON甚至是另一个Java的JSON库?

1 个答案:

答案 0 :(得分: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;
    }

}