171

我将收到来自 Obj-C 的 JSON 编码字符串,并且我正在解码一个虚拟字符串(目前),如下面的代码。我的输出以字符 'u' 为每个项目的前缀:

[{u'i': u'imap.gmail.com', u'p': u'aaaa'}, {u'i': u'333imap.com', u'p': u'bbbb'}...

JSON如何添加这个unicode char?删除它的最佳方法是什么?

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
4

9 回答 9

179

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

例如,试试这个:

print mail_accounts[0]["i"]

你不会看到你。

于 2012-12-18T19:44:46.197 回答
161

一切都很酷,伙计。'u' 是个好东西,它表示字符串在 python 2.x 中是 Unicode 类型。

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

于 2012-12-18T19:45:07.757 回答
59

下面的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"}
于 2015-12-27T10:56:42.800 回答
10

Unicode 在这里是合适的类型。JSONDecoder 文档描述了 json 字符串对象被解码为 Unicode 对象的转换表和状态

https://docs.python.org/2/library/json.html#encoders-and-decoders

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)。”

于 2012-12-18T19:46:20.023 回答
10

附加到对象的那些“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'}]
于 2018-06-30T05:29:01.307 回答
8

u前缀意味着这些字符串是 unicode 而不是 8 位字符串。不显示u前缀的最佳方法是切换到 Python 3,其中字符串默认为 unicode。如果这不是一个选项,str构造函数将从 unicode 转换为 8 位,因此只需在结果上递归循环并转换unicodestr. 但是,最好将字符串保留为 unicode。

于 2012-12-18T19:45:31.423 回答
4

在尝试使用 Pythonlogging库捕获日志中的 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'}
于 2018-08-15T12:18:12.347 回答
2

试试这个:

mail_accounts[0].encode("ascii")

于 2020-01-22T09:27:54.193 回答
-3

只需将 u' 替换为单引号...

print (str.replace(mail_accounts,"u'","'"))
于 2019-10-10T01:12:26.573 回答