问题
我正在尝试将REDIS数据库查询的结果转换为json数据。 REDIS返回一组字节字符串,我将其转换为常规字符串列表。
我现在需要一种转换为json的方法,以传递回我的REST接口的调用方。
但是出现以下错误:
TypeError: Object of type 'set' is not JSON serializable
代码
这是查询数据库的功能,我尝试将其从SET转换为LIST:
def get_db_email(mailbox):
if DEBUG: logging.info("get_db_email() debug started:")
try:
r = redis.Redis(connection_pool=POOL)
response = r.smembers(str(mailbox) + "-emails") # returns a python "set"
if len(response) > 0:
jdata = [] # create a list
for n in response:
if DEBUG: logging.info(n)
#convert byte string to string
jdata.append({n.decode("utf-8")}) # to get rid of "b" prefix
logging.info("****")
logging.info(jdata)
logging.info("####")
return True, jdata
else:
return False, 500
except Exception as ex:
logging.error("get_db_email() failed")
logging.error(ex)
return False, 500
这里是调用数据库查询的函数...
@application.route("/widgets/api/<int:mailbox>/email", methods=['GET'])
def get_email(mailbox):
if DEBUG:
logging.info("get_email() debug started:")
status, data_list = get_db_email(mailbox)
if DEBUG:
logging.info(status)
logging.info(type(data_list))
if status == True:
logging.info("poof")
json_data = json.dumps(data_list)
logging.info('the magic dragon')
return json_data
else:
return abort(data)
这是我看到的日志中的输出:
root - INFO - b'test@yahoo.com'
root - INFO - ****
root - INFO - [{'test@yahoo.com'}]
root - INFO - ####
root - INFO - True
root - INFO - <class 'list'>
root - INFO - poof
基于日志,我希望您能看到get_db_email返回一个真实的列表对象(通过该方法输出的btn内容包装为“ =====”和“ #####”。) 然后,要确认它是一个列表,调用函数将调用type(data_list),日志显示该类型为
当系统尝试调用json.dumps()时系统炸弹 从我阅读的内容和其他代码示例中,我认为我可以将列表对象传递到json.dumps中。 如果您可以告诉我我哪里出问题了,我将不胜感激。 谢谢。
答案 0 :(得分:0)
这里:
jdata = [] # create a list
for n in response:
#convert byte string to string
jdata.append({n.decode("utf-8")}) # to get rid of "b" prefix
您正在创建集合列表。应该是:
jdata = [] # create a list
for n in response:
#convert byte string to string
jdata.append(n.decode("utf-8"))
或更简单地说:
jdata = [n.decode("utf-8") for n in response]
此外,bytes.decode(encoding)
的目的不是“摆脱'b'前缀”,而是to build a unicode string from the byte string