2012-12-18 18 views
89

Będę otrzymywać kodowaną przez JSON ciąg znaków Obj-C i dekoduję łańcuch dummy (na razie) jak poniższy kod. Moja moc wychodzi z charakterem „U” poprzedzając każdą pozycję:Python: json.loads zwraca pozycje poprzedzające prefiksem 'u'

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

Jak JSON dodanie tego unicode char? Jaki jest najlepszy sposób, aby go usunąć?

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 
+6

Python ma pr oblem tutaj. Wszystko nie jest chłodem. Dostaję błędy w łańcuchach, które tworzy Python, gdy próbuję zapisać te ciągi do pliku. Na przykład, gdy python pobiera "53" z JSON, zamienia go na u'53 'i próbuje zapisać go do pliku jako heksadecymalnej u' \ xe1 ', co powoduje, że Python bierze doskonale dobry ciąg i rzyga na niego: JSON: {"sa_BstDeAv": "53", "sa_BwVUpMx" ... PYTHON: {u'sa_BstDeAv ': u'53', u'sa_BwVUpMx '... BŁĄD NA PISMA: Błąd wartości (kodek 'ascii' nie może kodować znaków u '\ xe1' w pozycji 5: porządkowy nie w zakresie (128)) –

+0

@janehouse Właściwą odpowiedzią tutaj jest odpowiedź jdi I really myśl, że powinieneś to zmienić. – Dekel

Odpowiedz

109

Przedrostek u oznacza tylko ciąg znaków Unicode. Kiedy naprawdę używasz ciągu znaków, nie pojawi się on w twoich danych. Nie należy rzucać na wydruk.

Na przykład, spróbuj tego:

print mail_accounts[0]["i"] 

Nie będzie widać u.

+2

Twoja odpowiedź była najbardziej przydatna, i myślę, że osoba pytająca o to pytanie naprawdę by to doceniła: http://stackoverflow.com/questions/956867/how-to-get-string-objects-instead-of -unicode-one-from-json-in-python – jimh

+1

Dziękuję bardzo! Byłem zdezorientowany z powodu twojego listu tak długo –

105

Wszystko jest w porządku, stary. "U" jest dobrą rzeczą, oznacza, że ​​ciąg znaków jest typu Unicode w python 2.x.

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

+53

Podoba mi się bardzo chłodny ton tego. +1 dla poprawnej odpowiedzi, która sprawiła, że ​​się uśmiechnąłem. – mgilson

+10

Po prostu, chłód ... (┛◉Д◉) ┛ 彡 ┻━┻ – fuzz

+14

To była najbardziej relaksująca odpowiedź, którą przeczytałem na temat StackOverflow. – aanrv

3

u przedrostek oznacza, że ​​te struny unicode zamiast 8-bitowych łańcuchów. Najlepszym sposobem, aby nie wyświetlać prefiksu u, jest przełączenie na język Python 3, w którym łańcuchy są domyślnie oznaczone symbolem Unicode. Jeśli nie jest to możliwe, konstruktor str konwertuje z formatu Unicode na 8-bitowy, więc po prostu pętlę rekursywnie nad wynikiem i przekonwertuj unicode na str. Najlepiej jest jednak pozostawić ciągi jako unicode.

8

Unicode jest tutaj odpowiednim typem. Docs JSONDecoder opisywać tabelę konwersji i stan, w którym obiekty JSON łańcuch są dekodowane na Unicode obiektów

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 

„kodowania określa kodowania użyty do interpretowania przedmiotów str zdekodowane przez instancję (UTF-8 przez domyślna)."

28

wierzę, że druk d3 poniżej jest jednym szukałeś (która jest połączeniem wysypisk i obciążeń) :)

uwzględniając:

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 

Wydruki:

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"} 
+2

Huh? 'json.dumps' konwertuje dict z powrotem na łańcuch (zakodowany w JSON). Nie tego chciał OP. -1. –

+4

Ale jeśli użyjesz go razem z json.loads wyjdzie ze słownika bez zakodowanych znaków wihch jest odpowiedzią na pytanie (to jest rysunek d3 powyżej) dobrze odczytaj odpowiedź! – Mercury

Powiązane problemy