Receberei uma sequência de caracteres codificada em JSON, Obj-C, e estou decodificando uma sequência fictícia (por enquanto) como o código abaixo. Minha saída sai com o caractere 'u' prefixando cada item:
[{u'i': u'imap.gmail.com', u'p': u'aaaa'}, {u'i': u'333imap.com', u'p': u'bbbb'}...
Como o JSON está adicionando esse caractere unicode? Qual é a melhor maneira de removê-lo?
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
Respostas:
O prefixo u significa apenas que você tem uma string Unicode. Quando você realmente usa a string, ela não aparece nos seus dados. Não seja jogado pela saída impressa.
Por exemplo, tente o seguinte:
Você não verá um u.
fonte
u
s nos seus dados. Francamente, imprimir umu
para indicar que é uma string Unicode é um dos piores erros do Python. Absolutamente ridículas. Por que não imprimir umaa
string antes de cada string, se for ASCII? Ei
se for um número inteiro?Está tudo bem, cara. O 'u' é uma coisa boa, indica que a string é do tipo Unicode no python 2.x.
http://docs.python.org/2/howto/unicode.html#the-unicode-type
fonte
A
d3
impressão abaixo é a que você está procurando (que é a combinação de lixões e cargas) :)Tendo:
Impressões:
fonte
json.dumps
converte o dict de volta em uma string (codificada em JSON). Não era isso que o OP queria fazer. -1.O
u
prefixo significa que essas cadeias são unicode em vez de cadeias de 8 bits. A melhor maneira de não mostrar ou
prefixo é mudar para Python 3, onde as strings são unicode por padrão. Se isso não for uma opção, ostr
construtor converterá de unicode para 8 bits, então simplesmente faça um loop recursivo sobre o resultado e converteráunicode
emstr
. No entanto, é provavelmente melhor deixar as seqüências como unicode.fonte
Unicode é um tipo apropriado aqui. Os documentos JSONDecoder descrevem a tabela de conversão e afirmam que os objetos da string json são decodificados em objetos Unicode
https://docs.python.org/2/library/json.html#encoders-and-decoders
"codificação determina a codificação usada para interpretar qualquer objeto str decodificado por esta instância (UTF-8 por padrão)."
fonte
Esses caracteres 'u' sendo anexados a um objeto significam que o objeto está codificado em "unicode".
Se você deseja remover os caracteres 'u' do seu objeto, você pode fazer isso:
Vamos fazer o checkout do python shell
fonte
Continuei com esse problema ao tentar capturar dados JSON no log com a
logging
biblioteca Python , para fins de depuração e solução de problemas. Obter ou
personagem é um verdadeiro incômodo quando você deseja copiar o texto e colá-lo em seu código em algum lugar.Como todos dirão, isso ocorre porque é uma representação Unicode e pode vir do fato de você ter usado
json.loads()
os dados de uma string em primeiro lugar.Se você deseja a representação JSON no log, sem o
u
prefixo, o truque é usarjson.dumps()
antes de fazer logout. Por exemplo:fonte
Tente o seguinte:
mail_accounts [0] .encode ("ascii")
fonte
Apenas substitua u por uma única citação ...
fonte