標籤(空格分隔): python 編碼 json
字串字首可以有r
,u
r
:表示原始(raw)字串,比如'\n'
不會被轉義。常用於正則。
u
:表示unicode字串。
python3系列的字串預設是unicode,無需用u進行轉碼。我用的是python2.7,所以還是要手動處理編碼。
發生問題的乙個場景是:從某個url抓取json格式資料,import了python自帶的json
或******json
包,呼叫其loads()
方法後,得到的物件(字典)的key的型別是unicode,形如:
obj=
而我當前的乙個函式,傳入引數為乙個dict字典,用它生成為sql語句,帶著u
的insert語句插入資料庫會報錯。需要去除u
。
帶u
是unicode型別,不帶u
的是字串型別。對於乙個unicode變數,可以用encode()
函式轉為str型別。但是現在有一整個字典的key都要轉換,我不知道怎麼轉換。
乙個解決方法是重寫乙個json構建/解析的函式。我並不想重複造輪子,只是python2.7下json和******json兩個包太難用。嘗試了各種引數,還是無法得到key為str型別而不是unicode型別的結果。
我傳給你的是ascii編碼的物件,為什麼不能返還給我乙個ascii編碼的物件?果斷自己寫乙個好用的。
dumps(序列化)
------------------->
obj str
物件 字串
<-------------------
loads(反序列化)
這裡採用類似dumps和loads的名字,不過加了自己的字首。
從obj物件(python中是字典型別)到str型別,是序列化(dumps)的過程;把str解析後裝載為obj物件,是反序列化(loads)的過程。序列化目的在於網路傳輸。
#!/usr/bin/python
#coding:utf-8
import types
#從obj到str
def chris_dumps(dict_data):
jar=
"" result = chris_dumps_iter(dict_data, jar)
return
""def chris_dumps_iter(dict_data, jar):
for k in dict_data:
jar = jar +"\"
"+ k +"\"
: "if
isinstance(dict_data[k], dict):
tmp = chris_dumps(dict_data[k])
jar = jar+tmp
elif
isinstance(dict_data[k], basestring):
jar = jar +"\"
"+dict_data[k]+"\"
"else:
jar = jar +
str(dict_data[k])
jar = jar +
", "
return jar[0:len(jar)-
2]#從str到objs
def chris_loads(data):
jar = {}
result = chris_loads_iter(data, jar)
return result
def chris_loads_iter(data, jar):
cnt =
0# count brackets :-1
key =
"" val =
"" quote=
false
colon =
false
# 冒號,false表示在冒號左邊,true表示在右邊
#for i in xrange(len(data)):
i=0while i<
len(data):
if quote:
if data[i]=="\"
": #右引號
if colon==
false:
quote=
false
else:
val += data[i]
else:
key += data[i]
else:
if data[i]=="\"
": #左引號
if colon==
false:
quote=
true
key =
""else:
val += data[i]
elif data[i]==
":":
colon =
true
elif data[i]==
","or data[i]==
'}':
#jar[key]=eval(val) #幹的漂亮!
jar[key]=
eval(val)
val =
"" colon =
false
elif data[i]==
" ":
pass
elif data[i]==
"': subdata += data[j]
j +=
1 subdata +=
"}" i=j+1
sub_result = chris_loads(subdata)
val=sub_result
jar[key]=sub_result
val =
"" colon =
false
else:
val += data[i]
i +=
1return jar
寫好了,測試一下:
if
__name__
=="__main__":
s1=s=}
t=chris_dumps(s)
g=s['property']
print
't:', t
q=chris_loads(t)
print
'q:', q
print
type(q)
p.s.其實這個loads函式寫的並不優美,正確的思路應當是畫出狀態自動機,列出每種情況以及各個情況之間的轉化關係。
python操作json資料
import json 一 讀取json資料 1.1 方法一 使用loads 方法讀取已有資料 data message json.loads data print message 1.2 方法二 使用load 方法讀取檔案資料 檔案儲存時必須位於同一行,不然直接load會報錯 with open ...
python中的json解析
主要實現以下功能 解析 與構造json,即encoder and decoder 官方指導 中文教程 前者將obj轉化為json str,後者將str轉化為python物件,如果json字串是個object,轉化為dict,若是array則轉化為list json寫法 表示array的json字串 ...
python 中 json的處理
python中的json物件,其實就是字典型別。利用json模組,可以將字串型別的json串轉換為 json物件 字典物件 也可以將json物件 字典物件 轉換為字串物件。如 coding utf 8 import json str obj json.loads str 字串轉字典物件 json物件...