Python: json.loads возвращает элементы с префиксом 'u'

Я получаю строчную форму с кодировкой JSON Obj-C, и я декодирую фиктивную строку (на данный момент), как и код ниже. Мой вывод выводится с символом '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

Ответ 1

Префикс u- означает, что у вас есть строка Unicode. Когда вы действительно используете строку, она не будет отображаться в ваших данных. Не бросайте печатный результат.

Например, попробуйте следующее:

print mail_accounts[0]["i"]

Вы не увидите u.

Ответ 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

Юникод - подходящий тип. Документы 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

"определяет кодировку, используемую для интерпретации любых объектов str, декодированных этим экземпляром (по умолчанию UTF-8)."

Ответ 5

Префикс u означает, что эти строки являются unicode, а не 8-битными. Лучший способ не показывать префикс u - это переключиться на Python 3, где строки по умолчанию имеют unicode. Если это не вариант, конструктор str будет преобразовывать из unicode в 8-битный, поэтому просто рекурсивно перебираем результат и преобразуем unicode в str. Однако, вероятно, лучше всего оставить строки как unicode.

Ответ 6

Эти символы 'u', добавляемые к объекту, означают, что объект закодирован в "Unicode".

Если вы хотите удалить эти символы 'u' из вашего объекта, вы можете сделать это:

import json, ast
jdata = ast.literal_eval(json.dumps(jdata)) # Removing uni-code chars

Пусть оформить заказ из оболочки Python

>>> 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'}]

Ответ 7

Я продолжал сталкиваться с этой проблемой при попытке записать данные JSON в журнал с помощью библиотеки logging Python для целей отладки и устранения неполадок. Получение символа u - это настоящая неприятность, когда вы хотите скопировать текст и вставить его в свой код где-нибудь.

Как все скажут вам, это потому, что это представление в Юникоде, и это может быть json.loads() с тем фактом, что вы использовали 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'}

Ответ 8

Просто замените u 'одинарной кавычкой...

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