2013-10-04 54 views
2

这是GCM的Python我的响应代码,如何将python字符串数据转换为列表或字典?

{"multicast_id":6343554431392278573,"success":5,"failure":15,"canonical_ids":0,"results":[{"message_id":"0:1380910865603840%356b 
9054f9fd7ecd"},{"error":"NotRegistered"},{"error":"NotRegistered"},{"error":"NotRegistered"},{"error":"NotRegistered"},{"error": 
"NotRegistered"},{"error":"NotRegistered"},{"error":"NotRegistered"},{"message_id":"0:1380910865592683%356b9054f9fd7ecd"},{"erro 
r":"NotRegistered"},{"error":"NotRegistered"},{"error":"NotRegistered"},{"error":"NotRegistered"},{"error":"NotRegistered"},{"er 
ror":"NotRegistered"},{"message_id":"0:1380910865600910%356b9054f9fd7ecd"},{"error":"NotRegistered"},{"message_id":"0:1380910865 
596592%356b9054f9fd7ecd"},{"error":"NotRegistered"},{"message_id":"0:1380910865595499%356b9054f9fd7ecd"}]} 

当我得到这个反应,我想收集来自字典中的所有错误的键...但现在看来似乎是一个字符串,我会尽力转储在JSON使用json.dumps(),然后删除斜杠,但不为我工作,甚至没有ast工作。我试试这个python json dumps。我在那里错过了什么?请帮助我。

+5

如果确实是一个字符串,请使用'json.loads'而不是'json.dumps'。 Dump =从数据对象到字符串(序列化); load =从字符串到数据对象(反序列化)。 – Hyperboreus

+0

我尝试使用json.loads ...像变量中的商店响应,并在循环中迭代:'code'result = [数据中的resp [json.loads(resp)]'code',我得到一个错误:'code' ValueError:未终止的字符串从第1行开始(第104行)“代码” – Shashank

+0

读取您的问题,尤其是如果您甚至不知道输入是字符串还是其他内容,限制了任何人的帮助你的能力。 – Hyperboreus

回答

2

当你接收到的数据是有效的Python数据,你可以简单地使用[ast.literal_eval] [1]

演示

import ast 
data = '''{"multicast_id":6343554431392278573,"success":5,"failure":15,"canonical_ids":0,"results":[{"message_id":"0:1380910865603840%356b9054f9fd7ecd"},{"error":"NotRegistered"},{"error":"NotRegistered"},{"error":"NotRegistered"},{"error":"NotRegistered"},{"error": 
"NotRegistered"},{"error":"NotRegistered"},{"error":"NotRegistered"},{"message_id":"0:1380910865592683%356b9054f9fd7ecd"},{"error":"NotRegistered"},{"error":"NotRegistered"},{"error":"NotRegistered"},{"error":"NotRegistered"},{"error":"NotRegistered"},{"error":"NotRegistered"},{"message_id":"0:1380910865600910%356b9054f9fd7ecd"},{"error":"NotRegistered"},{"message_id":"0:1380910865596592%356b9054f9fd7ecd"},{"error":"NotRegistered"},{"message_id":"0:1380910865595499%356b9054f9fd7ecd"}]}''' 

>>> pp.pprint(ast.literal_eval(data)) 
{ 'canonical_ids': 0, 
    'failure': 15, 
    'multicast_id': 6343554431392278573L, 
    'results': [ { 'message_id': '0:1380910865603840%356b9054f9fd7ecd'}, 
        { 'error': 'NotRegistered'}, 
        { 'error': 'NotRegistered'}, 
        { 'error': 'NotRegistered'}, 
        { 'error': 'NotRegistered'}, 
        { 'error': 'NotRegistered'}, 
        { 'error': 'NotRegistered'}, 
        { 'error': 'NotRegistered'}, 
        { 'message_id': '0:1380910865592683%356b9054f9fd7ecd'}, 
        { 'error': 'NotRegistered'}, 
        { 'error': 'NotRegistered'}, 
        { 'error': 'NotRegistered'}, 
        { 'error': 'NotRegistered'}, 
        { 'error': 'NotRegistered'}, 
        { 'error': 'NotRegistered'}, 
        { 'message_id': '0:1380910865600910%356b9054f9fd7ecd'}, 
        { 'error': 'NotRegistered'}, 
        { 'message_id': '0:1380910865596592%356b9054f9fd7ecd'}, 
        { 'error': 'NotRegistered'}, 
        { 'message_id': '0:1380910865595499%356b9054f9fd7ecd'}], 
    'success': 5} 
>>> 

随后倾错误

>>> pp.pprint([elem['error'] for elem in ast.literal_eval(data)['results'] if 'error' in elem]) 
[ 'NotRegistered', 
    'NotRegistered', 
    'NotRegistered', 
    'NotRegistered', 
    'NotRegistered', 
    'NotRegistered', 
    'NotRegistered', 
    'NotRegistered', 
    'NotRegistered', 
    'NotRegistered', 
    'NotRegistered', 
    'NotRegistered', 
    'NotRegistered', 
    'NotRegistered', 
    'NotRegistered'] 
+0

它看起来非常真棒答案,但我遇到了一些问题,这里是我做的:GCM给我的响应对象,其中包含http状态码,当我迭代它是这样的:data = for resp in response print resp,然后它显示包含字符串的字典。现在我尝试应用你的解决方案,但它给了我错误“SyntaxError:EOL while scanning string literal”,它混乱了我在字符串块中的响应.. – Shashank

+0

哎感谢这个解决方案,实际上我的数据是不正确的字符串...所以首先我让它像** d =(''.join(''+ resp +''resp in g_response))**然后应用ast ... – Shashank

4

如果它是一个字符串,加载它,不要放弃它:

#! /usr/bin/python3 

import json 

a = '''{"multicast_id":6343554431392278573,"success":5,"failure":15,"canonical_ids":0,"results":[{"message_id":"0:1380910865603840%356b9054f9fd7ecd"},{"error":"NotRegistered"},{"error":"NotRegistered"},{"error":"NotRegistered"},{"error":"NotRegistered"},{"error": 
"NotRegistered"},{"error":"NotRegistered"},{"error":"NotRegistered"},{"message_id":"0:1380910865592683%356b9054f9fd7ecd"},{"error":"NotRegistered"},{"error":"NotRegistered"},{"error":"NotRegistered"},{"error":"NotRegistered"},{"error":"NotRegistered"},{"error":"NotRegistered"},{"message_id":"0:1380910865600910%356b9054f9fd7ecd"},{"error":"NotRegistered"},{"message_id":"0:1380910865596592%356b9054f9fd7ecd"},{"error":"NotRegistered"},{"message_id":"0:1380910865595499%356b9054f9fd7ecd"}]}''' 

j = json.loads(a) 
errors = [d for d in j ['results'] if 'error' in d] 
print(errors) 
+0

最初我尝试加载它,但它显示一个错误:ValueError:未终止的字符串开始于:行1列104(char 104),所以首先我转储它,然后加载它,因为json给我一个错误。 – Shashank

+0

当python GCM返回一个响应对象时,我得到了我的回应,然后我迭代并将数据存储在列表中或尝试从循环中的json.loads中创建一个列表,但没有工作 – Shashank

相关问题