2013-05-10 5 views
1

В API, с которым я работаю, я получаю определенную часть как простой массив JSON вместо пары normal = = value. Это глупо, но с этим мне приходится иметь дело.Карта JSONArray по объекту

Пример:

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

Проблема становится Google GSON для отображения каждой позиции массива на поле в нормальном объекте. Поскольку неудивительно, что для этого не существует какой-либо поддержки, мне пришлось сворачивать свое собственное решение: каждый «запрос», который нуждается в преобразовании, реализует интерфейс CustomConvert, который имеет методы convertToObjects() и convertToJson(). Каждая «запись» имеет кучу полей с аннотацией @ArrayPosition(number). Методы преобразования переводят между двумя списками.

Как это уродливо, есть ли лучший способ сделать это с помощью Google GSON или даже другой библиотеки JSON для Java?

+1

Erm, написать сериализатор/десериализатор gson? Можете ли вы привести пример JSON, который вы получаете? –

+0

@Brian См. Править. И TMK с сериализатором/десериализатором он испортил бы что-нибудь еще, что возвращает JSONArray. – TheLQ

+0

. Вы не пишете ни одного для списка/массива - вы пишете один для объекта, который содержит поле 'build' и поле« List » , Передайте список параметров конструктору 'MyObject', чтобы создать экземпляр каждого из них и добавить его в« Список ». (Я предполагаю, что каждый внутренний массив в вашем массиве JSON представляет один и тот же тип объекта) –

ответ

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

Спасибо! Мне пришлось немного изменить настройки (build должно быть 'jo.get (" build "). GetAsString()'), но вы предоставили отличную отправную точку – TheLQ

Смежные вопросы