首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Retrofit解析以唯一id为key的JSON响应?

如何使用Retrofit解析以唯一id为key的JSON响应?
EN

Stack Overflow用户
提问于 2015-06-29 22:11:27
回答 2查看 753关注 0票数 0

我正在写一个应用程序来控制飞利浦色调智能灯使用他们的REST API和Square的Retrofit库。

问题是,当我调用/lights时,响应返回时使用每个光的id属性作为json响应中的键(而不是jsonapi响应中典型的光对象数组,这似乎是Retrofit所期望的)。

下面是我正在查看的请求/响应

GET /lights

返回

代码语言:javascript
复制
```javascript

"1":{

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

},

"2":{

代码语言:javascript
复制
"state": {
代码语言:javascript
复制
    "on": false,
代码语言:javascript
复制
    "bri": 0,
代码语言:javascript
复制
    "hue": 0,
代码语言:javascript
复制
    "sat": 0,
代码语言:javascript
复制
    "xy": [0,0],
代码语言:javascript
复制
    "ct": 0,
代码语言:javascript
复制
    "alert": "none",
代码语言:javascript
复制
    "effect": "none",
代码语言:javascript
复制
    "colormode": "hs",
代码语言:javascript
复制
    "reachable": true
代码语言:javascript
复制
},
代码语言:javascript
复制
"type": "Extended color light",
代码语言:javascript
复制
"name": "Hue Lamp 2",
代码语言:javascript
复制
"modelid": "LCT001",
代码语言:javascript
复制
"swversion": "66009461",
代码语言:javascript
复制
"pointsymbol": {
代码语言:javascript
复制
    "1": "none",
代码语言:javascript
复制
    "2": "none",
代码语言:javascript
复制
    "3": "none",
代码语言:javascript
复制
    "4": "none",
代码语言:javascript
复制
    "5": "none",
代码语言:javascript
复制
    "6": "none",
代码语言:javascript
复制
    "7": "none",
代码语言:javascript
复制
    "8": "none"
代码语言:javascript
复制
}

}

代码语言:javascript
复制

} `

请注意,它不是返回灯光对象数组,而是返回每个关闭其灯光id的灯光对象。

有谁知道如何用Retrofit来解析这个?

EN

回答 2

Stack Overflow用户

发布于 2015-06-29 23:23:43

Retrofit使用GSON来反序列化它接收的json,而json又使用一个类来理解您提供给它的json。

在Gson中,你也可以创建一个自定义的deserializer,有很多资源可以学习如何创建一个。

您可以在反序列化程序中执行的操作是获取json对象的键集并对其进行迭代。您可以获得密钥集,如下所示

代码语言:javascript
复制
Set<Map.Entry<String, JsonElement>> nodeSet = jsonObject.entrySet();

遍历此nodeSet和

代码语言:javascript
复制
for(Map.Entry<String, JsonElement> entryItem : nodeSet) {
        JsonObject currentValue = entryItem.getValue().getAsJsonObject();
}

currentValue将包含“状态”、“类型”等元素的JsonObject。

票数 1
EN

Stack Overflow用户

发布于 2017-03-23 15:59:00

根据此StackOverflow问题Retrofit parse JSON dynamic keys的答案

使用包含单个地图字段的类

代码语言:javascript
复制
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;
    ...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31117924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档