python列表-无法转换为json

时间:2019-01-15 15:21:20

标签: python json

问题

我正在尝试将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中。 如果您可以告诉我我哪里出问题了,我将不胜感激。 谢谢。

1 个答案:

答案 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