Otrzymam ciąg zakodowany w formacie JSON w postaci Obj-C i dekoduję fikcyjny ciąg (na razie) taki jak w poniższym kodzie. Moje dane wyjściowe są wyświetlane ze znakiem „u” poprzedzającym każdą pozycję:
[{u'i': u'imap.gmail.com', u'p': u'aaaa'}, {u'i': u'333imap.com', u'p': u'bbbb'}...
W jaki sposób JSON dodaje ten znak Unicode? Jak najlepiej 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
Odpowiedzi:
Prefiks u- oznacza po prostu, że masz ciąg znaków Unicode. Kiedy naprawdę używasz ciągu, nie pojawi się on w twoich danych. Nie daj się wyrzucić przez wydruk.
Na przykład spróbuj tego:
Nie zobaczysz u.
źródło
u
plików w swoich danych. Szczerze mówiąc, wydrukowanie a,u
aby wskazać, że jest to łańcuch Unicode, jest jednym z najgorszych błędów w Pythonie. Całkowicie śmieszne. Dlaczego nie wypisaća
przed każdym ciągiem znaków ASCII? Ai
jeśli jest to liczba całkowita?Wszystko w porządku, stary. Litera „u” to dobra rzecz, wskazuje, że w pythonie 2.x łańcuch jest typu Unicode.
http://docs.python.org/2/howto/unicode.html#the-unicode-type
źródło
Poniższy
d3
wydruk to ten, którego szukasz (czyli połączenie zrzutów i ładunków) :)Mający:
Wydruki:
źródło
json.dumps
konwertuje dict z powrotem na ciąg (zakodowany w formacie JSON). Nie tego chciał zrobić OP. -1.Te
u
środki prefiks, że te ciągi są Unicode zamiast 8-bitowe ciągi. Najlepszym sposobem, aby nie pokazywaću
prefiksu, jest przełączenie się na Python 3, w którym ciągi znaków są domyślnie unicode. Jeśli to nie jest opcja,str
konstruktor konwertuje z Unicode na 8-bitowy, więc po prostu zapętlaj rekurencyjnie wynik i przekonwertujunicode
nastr
. Jednak prawdopodobnie najlepiej jest pozostawić ciągi jako Unicode.źródło
Unicode jest tutaj odpowiednim typem. Dokumentacja JSONDecoder opisuje tabelę konwersji i stwierdza, że obiekty stringów json są dekodowane do obiektów Unicode
https://docs.python.org/2/library/json.html#encoders-and-decoders
„kodowanie określa kodowanie używane do interpretacji dowolnych obiektów str dekodowanych przez tę instancję (domyślnie UTF-8)”.
źródło
Te znaki „u” dołączane do obiektu oznaczają, że obiekt jest zakodowany w „unicode”.
Jeśli chcesz usunąć te znaki 'u' ze swojego obiektu, możesz to zrobić:
Sprawdźmy z powłoki Pythona
źródło
Ciągle napotykałem ten problem, próbując przechwycić dane JSON w dzienniku za pomocą
logging
biblioteki Python , w celu debugowania i rozwiązywania problemów. Uzyskanieu
znaku jest naprawdę uciążliwe, gdy chcesz skopiować tekst i wkleić go gdzieś w swoim kodzie.Jak wszyscy powiedzą, dzieje się tak dlatego, że jest to reprezentacja Unicode i może to wynikać z faktu, że
json.loads()
w pierwszej kolejności ładowałeś dane z łańcucha.Jeśli chcesz, aby w dzienniku była reprezentacja JSON, bez
u
prefiksu, sztuczka polega na użyciujson.dumps()
przed wylogowaniem. Na przykład:źródło
Spróbuj tego:
mail_accounts [0] .encode („ascii”)
źródło
Wystarczy zastąpić u 'pojedynczym cudzysłowem ...
źródło