Loads 返回前缀为“ u”的条目

我将从 目标 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
237803 次浏览

U 前缀意味着您有一个 Unicode 字符串。当您真正使用字符串时,它不会出现在您的数据中。不要被打印输出抛出。

例如,试试这个:

print mail_accounts[0]["i"]

你不会看到你的。

一切都很好,伙计。“ u”是一个好东西,它表明该字符串的类型是 python 2.x 中的 Unicode。

Http://docs.python.org/2/howto/unicode.html#the-unicode-type

u前缀意味着这些字符串是 Unicode 而不是8位字符串。不显示 u前缀的最佳方法是切换到 Python3,其中字符串默认为 unicode。如果没有这个选项,那么 str构造函数将从 unicode 转换为8位,因此只需递归地遍历结果并将 unicode转换为 str。但是,最好还是将字符串保留为 unicode。

Unicode 在这里是适当的类型。JSONDecder 文档描述了转换表,并指出 JSON 字符串对象被解码为 Unicode 对象。

来自 编码器和解码器:

JSON                    Python
==================================
object                  dict
array                   list
string                  unicode
number (int)            int, long
number (real)           float
true                    True
false                   False
null                    None

”编码决定用于解释由此实例解码的任何 str 对象的编码(默认为 UTF-8)

下面的 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"}

追加到对象后面的那些“ 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'}]

出于调试和故障排除的目的,在尝试使用 Python logging库捕获日志中的 JSON 数据时,我一直遇到这个问题。当您想要复制文本并将其粘贴到代码中的某个位置时,获取 u字符是一件非常麻烦的事情。

每个人都会告诉您,这是因为它是一个 Unicode 表示形式,它可能来自于您首先使用 json.loads()从字符串加载数据这一事实。

如果希望在日志中使用 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'}

只要把 u 换成单引号..。

print (str.replace(mail_accounts,"u'","'"))

试试这个:

mail_accounts[0].encode("ascii")