Python:json.loads 返回以“u”为前缀的项目
- 2025-02-21 08:50:00
- admin 原创
- 6
问题描述:
我将从Objective-C接收 JSON 编码的字符串,并且我正在解码一个虚拟字符串(目前),如下面的代码所示。我的输出是在每个项目前面加上字符“u”:
[{u'i': u'imap.gmail.com', u'p': u'aaaa'}, {u'i': u'333imap.com', u'p': u'bbbb'}...
JSON 如何添加此 Unicode 字符?删除它的最佳方法是什么?
mail_accounts = []
da = {}
try:
s = '[{"i":"imap.gmail.com","p":"aaaa"},{"i":"imap.aol.com","p":"bbbb"},{"i":"333imap.com","p":"ccccc"},{"i":"444ap.gmail.com","p":"ddddd"},{"i":"555imap.gmail.com","p":"eee"}]'
jdata = json.loads(s)
for d in jdata:
for key, value in d.iteritems():
if key not in da:
da[key] = value
else:
da = {}
da[key] = value
mail_accounts.append(da)
except Exception, err:
sys.stderr.write('Exception Error: %s' % str(err))
print mail_accounts
解决方案 1:
u- 前缀仅表示您有一个 Unicode 字符串。当您真正使用该字符串时,它不会出现在您的数据中。不要被打印的输出所困扰。
例如,尝试这个:
print mail_accounts[0]["i"]
您不会看到 u。
解决方案 2:
一切都很酷,伙计。'u' 是个好东西,它表示字符串在 python 2.x 中属于 Unicode 类型。
http://docs.python.org/2/howto/unicode.html#the-unicode-type
解决方案 3:
下面的打印d3
就是您正在寻找的(它是转储和负载的组合):)
具有:
import json
d = """{"Aa": 1, "BB": "blabla", "cc": "False"}"""
d1 = json.loads(d) # Produces a dictionary out of the given string
d2 = json.dumps(d) # Produces a string out of a given dict or string
d3 = json.dumps(json.loads(d)) # 'dumps' gets the dict from 'loads' this time
print "d1: " + str(d1)
print "d2: " + d2
print "d3: " + d3
印刷:
d1: {u'Aa': 1, u'cc': u'False', u'BB': u'blabla'}
d2: "{\"Aa\": 1, \"BB\": \"blabla\", \"cc\": \"False\"}"
d3: {"Aa": 1, "cc": "False", "BB": "blabla"}
解决方案 4:
附加到对象上的“u”字符表示该对象是以Unicode编码的。
如果您想从对象中删除那些“u”字符,您可以执行以下操作:
import json, ast
jdata = ast.literal_eval(json.dumps(jdata)) # Removing uni-code chars
让我们从 python shell 中检查一下
>>> import json, ast
>>> jdata = [{u'i': u'imap.gmail.com', u'p': u'aaaa'}, {u'i': u'333imap.com', u'p': u'bbbb'}]
>>> jdata = ast.literal_eval(json.dumps(jdata))
>>> jdata
[{'i': 'imap.gmail.com', 'p': 'aaaa'}, {'i': '333imap.com', 'p': 'bbbb'}]
解决方案 5:
Unicode 是此处合适的类型。JSONDecoder 文档描述了转换表,并指出 JSON 字符串对象被解码为 Unicode 对象。
来自18.2.2.编码器和解码器:
JSON Python
==================================
object dict
array list
string unicode
number (int) int, long
number (real) float
true True
false False
null None
“encoding 确定用于解释此实例解码的任何 str 对象的编码(默认为 UTF-8)。”
解决方案 6:
前缀u
表示这些字符串是 unicode 而不是 8 位字符串。不显示u
前缀的最佳方法是切换到 Python 3,其中字符串默认为 unicode。如果这不是一个选项,str
构造函数将从 unicode 转换为 8 位,因此只需对结果进行递归循环并转换unicode
为str
。但是,最好将字符串保留为 unicode。
解决方案 7:
logging
当我尝试使用 Python库捕获日志中的 JSON 数据以进行调试和故障排除时,我总是遇到这个问题。u
当您想要复制文本并将其粘贴到代码中的某个地方时,获取字符是一件非常麻烦的事情。
json.loads()
每个人都会告诉你,这是因为它是一种 Unicode 表示,而且它可能来自于你首先习惯从字符串中加载数据的事实。
如果您希望日志中的 JSON 表示不u
带前缀,则技巧是json.dumps()
在将其注销之前使用。例如:
import json
import logging
# Prepare the data
json_data = json.loads('{"key": "value"}')
# Log normally and get the Unicode indicator
logging.warning('data: {}'.format(json_data))
>>> WARNING:root:data: {u'key': u'value'}
# Dump to a string before logging and get clean output!
logging.warning('data: {}'.format(json.dumps(json_data)))
>>> WARNING:root:data: {'key': 'value'}
解决方案 8:
尝试一下:
mail_accounts[0].encode("ascii")
解决方案 9:
只需用单引号替换 u'...
print (str.replace(mail_accounts,"u'","'"))
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)