无法将字节列表解码为字符串列表

时间:2019-10-10 13:05:07

标签: json python-3.x decode

在我的用户变量中,我存储了从本地ldap获取的字节列表,并使用for循环转换为字符串列表。 我必须将此列表作为jsonify返回。 如果我不使用该编码密钥,则会得到与原始编码不同的输出,但仍会编码。 问题是我无法在任何地方访问解码方法。 有帮助吗?

users = ldap.get_group_members('ship_crew')

 user_list = []
 for user in users:
     user_list.append((str(user, encoding='utf-8').split(",")[0].split("=")[1]))
 return jsonify(user_list)

用户变量的原始列表:

[
  "cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com", 
  "cn=Turanga Leela,ou=people,dc=planetexpress,dc=com", 
  "cn=Bender Bending Rodr\u00edguez,ou=people,dc=planetexpress,dc=com"
]

具有编码输出的循环:

[
  "Philip J. Fry", 
  "Turanga Leela", 
  "Bender Bending Rodr\u00edguez"
]

预期:

[
  "Philip J. Fry", 
  "Turanga Leela", 
  "Bender Bending Rodríguez"
]

2 个答案:

答案 0 :(得分:0)

我将使用正则表达式提取您的姓名:

import re
l = [
  "cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com", 
  "cn=Turanga Leela,ou=people,dc=planetexpress,dc=com", 
  "cn=Bender Bending Rodr\u00edguez,ou=people,dc=planetexpress,dc=com"
]

NAME_PATTERN = re.compile(r'cn=(.*?),')
result = [NAME_PATTERN.match(s).group(1) for s in l]
print(result)

输出:

['Philip J. Fry', 'Turanga Leela', 'Bender Bending Rodríguez']

请注意,当您将其转储为JSON时,不支持í,因为默认情况下会尝试转换为ASCII,因此会将其转储为UTF-16(Unicode 0x00ED):

import json
print(json.dumps(result, indent=2))

输出:

[
  "Philip J. Fry",
  "Turanga Leela",
  "Bender Bending Rodr\u00edguez"
]

您可以根据需要通过设置ensure_ascii=False来解决此问题,尽管如果您在API中使用此方法,我会小心并坚持使用Unicode编码的ASCII:

print(json.dumps(result, indent=2, ensure_ascii=False))

输出:

[
  "Philip J. Fry",
  "Turanga Leela",
  "Bender Bending Rodríguez"
]

答案 1 :(得分:0)

您的输出是正确的JSON。 Unicode代码点00ED是í,在JSON中,任何字符都可以使用其Unicode代码点进行转义。 JSON输出中的“ \ 00ed”是写入该字符的有效方法。

使用该字符而不对其进行编码也是正确的JSON,但是显然jsonify选择对其进行编码。

然后任何合格的JSON解码器都会将其变回í。

如果使用标准库的json.dumps,则可以使用ensure_ascii=False来防止这种行为,但是我不知道“ jsonify”是什么。