Python中的json操作

2021-09-22 16:54:49 字數 3590 閱讀 3084

標籤(空格分隔): 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物件...