从json转储中获取元素

时间:2014-07-25 14:35:11

标签: python json

我使用以下python代码连接到jsonrpc服务器并删除一些歌曲信息。但是,我无法弄清楚如何将当前标题输入变量以在其他地方打印。这是代码:

TracksInfo = []
for song in playingSongs:
    data = { "id":1,
            "method":"slim.request",
            "params":[ "", 
                        ["songinfo",0,100, "track_id:%s" % song, "tags:GPASIediqtymkovrfijnCYXRTIuwxN"]
              ]
        }
    params = json.dumps(data, sort_keys=True, indent=4)
    conn.request("POST", "/jsonrpc.js", params)
    httpResponse = conn.getresponse()
    data = httpResponse.read()
    responce = json.loads(data)
    print json.dumps(responce, sort_keys=True, indent=4)
    TrackInfo = responce['result']["songinfo_loop"][0]
    TracksInfo.append(TrackInfo)

这使我以json格式返回数据,并且打印json.dump带回来:

pi@raspberrypi ~/pithon $ sudo python tom3.py 
{
    "id": 1, 
    "method": "slim.request", 
    "params": [
        "", 
        [
            "songinfo", 
            "0", 
            100, 
            "track_id:-140501481178464", 
            "tags:GPASIediqtymkovrfijnCYXRTIuwxN"
        ]
    ], 
    "result": {
        "songinfo_loop": [
            {
                "id": "-140501481178464"
            }, 
            {
                "title": "Witchcraft"
            }, 
            {
                "artist": "Pendulum"
            }, 
            {
                "duration": "253"
            }, 
            {
                "tracknum": "1"
            }, 
            {
                "type": "Ogg Vorbis (Spotify)"
            }, 
            {
                "bitrate": "320k VBR"
            }, 
            {
                "coverart": "0"
            }, 
            {
                "url": "spotify:track:2A7ZZ1tjaluKYMlT3ItSfN"
            }, 
            {
                "remote": 1
            }
        ]
    }
}

我想要得到的是result.songinfoloop.title(但我试过了!)

3 个答案:

答案 0 :(得分:0)

songinfo_loop结构是......奇特的。它是一个字典列表,每个字典只有一个键

循环播放,直到你有一个标题:

TrackInfo = next(d['title'] for d in responce['result']["songinfo_loop"] if 'title' in d)
TracksInfo.append(TrackInfo)

更好的选择是“崩溃”。所有这些词典合二为一:

songinfo = reduce(lambda d, p: d.update(p) or d, 
                  responce['result']["songinfo_loop"], {})
TracksInfo.append(songinfo['title'])

答案 1 :(得分:0)

songinfo_loop是一个不是字典的列表。这意味着你需要按位置调用它,或者循环遍历它并找到键值为“title”的dict

位置:

responce["result"]["songinfo_loop"][1]["title"]

循环:

for info in responce["result"]["songinfo_loop"]:
    if "title" in info.keys():
        print info["title"]
        break
else:
    print "no song title found"

真的,似乎你想让songinfo_loop成为一个字典,而不是一个列表。但如果您需要将其保留为列表,则可以使用此标题。

答案 2 :(得分:-1)

结果实际上是一个标准的python dict,所以你可以使用

responce["result"]["songinfoloop"]["title"]

哪个应该有用