2015-06-29 2 views
0

Я пишу приложение для управления смартфонами Philips Hue, используя их REST API и библиотеку Square's Retrofit.Как использовать Retrofit для анализа ответа JSON, который использует уникальный идентификатор в качестве ключа?

Проблема заключается в том, когда я делаю вызов /lights ответ приходит обратно, используя id свойство каждого источника света в качестве ключа в ответ JSON (а не массив световых объектов, что характерно в ответ jsonapi, и что кажется Ожидается, что «Модернизация»).

Вот запрос/ответ Я смотрю на

GET /lights

возвращает

`` ` {

"1": { 
    "state": { 
     "on": true, 
     "bri": 144, 
     "hue": 13088, 
     "sat": 212, 
     "xy": [0.5128,0.4147], 
     "ct": 467, 
     "alert": "none", 
     "effect": "none", 
     "colormode": "xy", 
     "reachable": true 
    }, 
    "type": "Extended color light", 
    "name": "Hue Lamp 1", 
    "modelid": "LCT001", 
    "swversion": "66009461", 
    "pointsymbol": { 
     "1": "none", 
     "2": "none", 
     "3": "none", 
     "4": "none", 
     "5": "none", 
     "6": "none", 
     "7": "none", 
     "8": "none" 
    } 
}, 
"2": { 
    "state": { 
     "on": false, 
     "bri": 0, 
     "hue": 0, 
     "sat": 0, 
     "xy": [0,0], 
     "ct": 0, 
     "alert": "none", 
     "effect": "none", 
     "colormode": "hs", 
     "reachable": true 
    }, 
    "type": "Extended color light", 
    "name": "Hue Lamp 2", 
    "modelid": "LCT001", 
    "swversion": "66009461", 
    "pointsymbol": { 
     "1": "none", 
     "2": "none", 
     "3": "none", 
     "4": "none", 
     "5": "none", 
     "6": "none", 
     "7": "none", 
     "8": "none" 
    } 
} 

} ` ``

Обратите внимание, как inste объявление возврата массива светлых объектов, оно возвращает каждый светлый объект, сбитый с его светового идентификатора.

У кого-нибудь есть идеи, как разобрать это с помощью Дооснащения?

+0

Используете ли вы GSON или smething, как это? AFAIR GSON не может анализировать регулярные выражения для аннотированных полей, поэтому лучше всего использовать библиотеку Джексона для разбора и вручную преобразовать его в массив. – MightySeal

ответ

1

Retrofit использует GSON для десериализации получаемого json, который, в свою очередь, использует класс, чтобы понять, как вы его кормите.

В Gson вы также можете создать обычай deserializer, есть много ресурсов для изучения того, как его создать.

Что вы можете сделать в десериализаторе - это получить набор ключей json-объекта и перебрать его. Вы можете получить набор ключей, как

Set<Map.Entry<String, JsonElement>> nodeSet = jsonObject.entrySet(); 

перебрать этого NodeSet и

for(Map.Entry<String, JsonElement> entryItem : nodeSet) { 
     JsonObject currentValue = entryItem.getValue().getAsJsonObject(); 
} 

The CurrentValue бы JSONObject, содержащий "состояние", "тип" и т.д. элементы.

0

На основании ответа от этого StackOverflow вопрос Retrofit parse JSON dynamic keys

Используйте класс, который содержит одно поле карты

class Lights { 
    // key is id of the light 
    // value is the Light object which contains all the attributes 
    Map<String, Light> allLights; 
} 

class Light { 
    // all the attributes 
    State state; 
    String type; 
    ... 
}