2012-12-18 28 views
89

Tôi sẽ nhận được một dạng chuỗi được mã hóa JSON Obj-C và tôi đang giải mã một chuỗi giả (hiện tại) như mã bên dưới. Đầu ra của tôi xuất hiện với ký tự 'u' tiền tố mỗi mục:Python: json.loads trả về các mục tiền tố bằng 'u'

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

Làm thế nào để thêm JSON unicode char này? Cách tốt nhất để loại bỏ nó là gì?

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 không có pr biểu tượng ở đây. Mọi thứ đều không lạnh. Tôi nhận được lỗi trong các chuỗi mà Python tạo ra khi tôi thử và viết các chuỗi này vào một tệp. Ví dụ khi python lấy "53" từ JSON nó biến nó thành u'53 'và cố gắng ghi nó vào một tập tin dưới dạng ký tự hex u' \ xe1 ', làm cho Python lấy một chuỗi hoàn toàn tốt và mâu thuẫn trên nó: JSON: {"sa_BstDeAv": "53", "sa_BwVUpMx" ... PYTHON: {u'sa_BstDeAv ': u'53', u'sa_BwVUpMx '... LRI TRÊN VIẾT: Lỗi giá trị ('ascii' codec không thể mã hóa ký tự u '\ xe1' ở vị trí 5: thứ tự không nằm trong phạm vi (128)) –

+0

@janehouse câu trả lời đúng ở đây là câu trả lời của jdi Tôi thực sự nghĩ rằng bạn nên thay đổi nó. – Dekel

Trả lời

109

Tiền tố u chỉ có nghĩa là bạn có chuỗi Unicode. Khi bạn thực sự sử dụng chuỗi, chuỗi đó sẽ không xuất hiện trong dữ liệu của bạn. Không được ném bởi đầu ra in.

Ví dụ, hãy thử này:

print mail_accounts[0]["i"] 

Bạn sẽ không thấy một u.

+2

Câu trả lời của bạn là câu trả lời hữu ích nhất mà tôi có và tôi nghĩ người hỏi câu hỏi này sẽ thực sự đánh giá cao câu hỏi này: http://stackoverflow.com/questions/956867/how-to-get-string-objects-instead-of -Mã-người-từ-json-in-python – jimh

+1

Cảm ơn bạn rất nhiều! Tôi đã nhầm lẫn với chữ cái 'u' 'quá lâu –

105

Mọi thứ đều tuyệt, người đàn ông. 'U' là một điều tốt, nó chỉ ra rằng chuỗi là loại Unicode trong python 2.x.

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

+53

Tôi thích giai điệu rất lạnh của cái này. 1 cho một câu trả lời (chính xác) khiến tôi mỉm cười. – mgilson

+10

Chỉ cần, thư giãn ... (┛◉Д◉) ┛ 彡 ┻━┻ – fuzz

+14

Đó là câu trả lời thư giãn nhất mà tôi đã đọc trên StackOverflow. – aanrv

3

Các u tiền tố có nghĩa là những chuỗi là unicode chứ không phải là chuỗi 8-bit. Cách tốt nhất để không hiển thị tiền tố u là chuyển sang Python 3, trong đó chuỗi là unicode theo mặc định. Nếu đó không phải là một tùy chọn, hàm tạo str sẽ chuyển đổi từ unicode thành 8 bit, do đó, chỉ cần lặp lại đệ quy qua kết quả và chuyển đổi unicode thành str. Tuy nhiên, nó có lẽ là tốt nhất chỉ để lại các chuỗi như unicode.

8

Unicode là một loại phù hợp tại đây. Các tài liệu JSONDecoder mô tả các bảng chuyển đổi và tuyên bố rằng đối tượng chuỗi json được giải mã thành Unicode đối tượng

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 

"mã hóa xác định mã hóa dùng để giải thích bất kỳ đối tượng str giải mã bởi trường hợp này (UTF-8 bằng mặc định)."

28

Tôi tin rằng d3 in dưới đây là một trong những bạn đang tìm kiếm (đó là sự kết hợp của bãi và tải) :)

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 

Prints:

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' chuyển đổi dict trở lại thành chuỗi (được mã hóa JSON). Đó không phải là những gì OP muốn làm. -1. –

+4

Nhưng nếu bạn sử dụng nó cùng với json.loads nó kết quả đầu ra từ điển mà không có các ký tự được mã hóa là một câu trả lời cho câu hỏi (đây là d3 in ở trên) đọc câu trả lời tốt! – Mercury

Các vấn đề liên quan