溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python 操作json

發(fā)布時(shí)間:2020-07-09 04:35:14 來源:網(wǎng)絡(luò) 閱讀:213 作者:qq5a16e6241946e 欄目:編程語言
Json語法規(guī)則:
數(shù)據(jù)在名稱/值對(duì)中
數(shù)據(jù)由逗號(hào)分隔
花括號(hào)保存對(duì)象
方括號(hào)保存數(shù)組

Json字符串本質(zhì)上是一個(gè)字符串,用單引號(hào)表示

Json數(shù)據(jù)的書寫格式
名稱--值對(duì),包括名稱字段(在雙引號(hào)中),后面跟一個(gè)冒號(hào),然后是值:
“name”: ”zhangsan” 等價(jià)于name = “zhangsan”

Json值
值可以是
數(shù)字(整數(shù)或浮點(diǎn)數(shù))
字符串(雙引號(hào)括起來)
邏輯值(true或false)
數(shù)組(在方括號(hào)中)
對(duì)象(在花括號(hào)中)
null

Json對(duì)象
Json的對(duì)象是在大括號(hào)中的,
{“name”:”zhangsan”,”age”:20} 

等價(jià) name=”zhangsan” age = 20

Json數(shù)組
Json數(shù)組是在中括號(hào)中的,數(shù)組可以包含多個(gè)對(duì)象
{
 "employees": [
 { "firstName":"John" , "lastName":"Doe" }, 
 { "firstName":"Anna" , "lastName":"Smith" }, 
 { "firstName":"Peter" , "lastName":"Jones" }
 ]
}
Employees是包含三個(gè)對(duì)象的數(shù)組

編碼Json.dumps()
將一個(gè)python對(duì)象編碼成json字符串,

Python的列表轉(zhuǎn)換成json數(shù)組
>>> json.dumps([1,2,3,"a"])

'[1, 2, 3, "a"]'

Python的字符串轉(zhuǎn)換成json字符串

>>> json.dumps("abc123")
'"abc123"'

Python元組轉(zhuǎn)換成json數(shù)組

>>> json.dumps((1,2,3,"abc"))
'[1, 2, 3, "abc"]'

Python的字典轉(zhuǎn)換成json的對(duì)象
>>> json.dumps({1:"a",2:"b",3:"c"})
'{"1": "a", "2": "b", "3": "c"}''#注意1、2、3被加上了雙引號(hào),因?yàn)閖son的名稱是必須要加雙引號(hào)的

Python的數(shù)字(int)轉(zhuǎn)換成json的數(shù)字
>>> json.dumps(1235)
'1235'

Python的unicode字符串轉(zhuǎn)換成json的字符串
>>> json.dumps(u"abcd")
'"abcd"'

Python的True轉(zhuǎn)換成json的true
>>> json.dumps(True)
'true'

Python的False轉(zhuǎn)換成json的false
>>> json.dumps(False)
'false'

Python的None轉(zhuǎn)換成json的null
>>> json.dumps(None)
'null'

>>> type(json.dumps("[1,2,3]")) #json本質(zhì)上是一個(gè)字符串

<class 'str'>
>>> type(json.dumps("abc"))
<class 'str'>

Python類型和json類型的對(duì)應(yīng)關(guān)系

怎么判斷一個(gè)json 是不是合法的?
用try except
try:
    json.loads('"abc"')
except Exception,e:
    print e
else:
print "ok"

json.dumps()函數(shù)參數(shù)應(yīng)用
dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding='utf-8', default=None, sort_keys=False, **kw)
該方法返回編碼后的一個(gè)json字符串
sort_keys
是否按key排序,sort_keys = True升序排序
>>> data = [{"a":"A",'d':4,"b":(2,4),"c":3.0}]

>>> print(json.dumps(data))

[{"a": "A", "d": 4, "b": [2, 4], "c": 3.0}]

>>> print(json.dumps(data,sort_keys=True))
[{"a": "A", "b": [2, 4], "c": 3.0, "d": 4}]

indent 
設(shè)置參數(shù)縮進(jìn)顯示的空格數(shù)。縮進(jìn)顯示使讀起來更加清晰。
>>> import json
>>> data = [{"a": "A", "b": [2, 4], "c": 3.0}]
>>> print(json.dumps(data,sort_keys=True,indent=4))
[
    {
        "a": "A",
        "b": [
            2,
            4
        ],
        "c": 3.0
    }
]

Separators
參數(shù)的作用是去掉逗號(hào)“,”和分號(hào)“:”后面的空格,從上面的輸出果都能看到“,”與“:”后面都有個(gè)空格,這都是為了美化輸出結(jié)果的作用,但是在我們傳輸數(shù)據(jù)的過程中,越精簡越好,冗余的東西全部去掉,因此就可以加上separators參數(shù)對(duì)傳輸?shù)膉son串進(jìn)行壓縮。該參數(shù)是元組格式的

>>> import json
>>> data = [{"a": "A", "b": [2, 4], "c": 3.0}]
>>> print(len(json.dumps(data)))
35
>>> print(len(json.dumps(data,separators=(',',':'))))
29
skipkeys
在encoding過程中,dict對(duì)象的key只可以是基本數(shù)據(jù)類型(str,unicode,int,float,bool,None),如果是其他類型,那么在編碼過程中就會(huì)拋出TypeError的異常。skipkeys可以跳過那些非string對(duì)象的key的處理,就是不處理

#coding=utf-8
import json
data = [{'a':'A','b':(2,4),'c':3.0,(1,2):'D tuple'}]
print(u"不設(shè)置skipkeys 參數(shù)")
try:
    res1 = json.dumps(data)
except Exception as e:
    print(e)

print(u"設(shè)置skipkeys 參數(shù)")
print(json.dumps(data,skipkeys=True))

json.loads()
將一個(gè)json字符串解碼成python對(duì)象

解碼json對(duì)象到python字典

>>> import json
>>> json.loads('{"a":1,"b":2}')#注意外面有單引號(hào)
{'a': 1, 'b': 2}

解碼json數(shù)組到python的列表
>>> json.loads('["a","b",2]')
['a', 'b', 2]

解碼json的字符串到python的字符串
>>> json.loads('"abc"')
'abc'

解碼json的true\false到python的True,F(xiàn)alse

>>> json.loads('true')
True
>>> json.loads('false')
False

解碼json的null到python的None
>>> print(json.loads('null'))
None

解碼json的數(shù)字到python的int、float

>>> json.loads('123')
123
>>> json.loads('123.20')
123.2

>>> a  =[{1:12,'a':12.3},[1,2,3],(1,2),'abc',u"ab",12]
>>> print("編碼后:\n",json.dumps(a))
編碼后:
 [{"1": 12, "a": 12.3}, [1, 2, 3], [1, 2], "abc", "ab", 12]
>>> print("解碼后: ",json.loads(json.dumps(a)))
解碼后:  [{'1': 12, 'a': 12.3}, [1, 2, 3], [1, 2], 'abc', 'ab', 12]

注意:
json格式的字符串解碼成Python對(duì)象以后,String類型都變成了str類型,數(shù)組變成了list,不會(huì)回到原來的元組類型,字典key的字符類型也被轉(zhuǎn)成字符串類型

從json到python的類型轉(zhuǎn)換

將類對(duì)象編碼成json串
Python中的dict對(duì)象可以直接序列化為json的{},但是很多時(shí)候,可能用class表示對(duì)象,比如定義Employe類,然后直接去序列化就會(huì)報(bào)錯(cuò)。原因是類不是一個(gè)可以直接序列化的對(duì)象,但我們可以使用dumps()函數(shù)中的default參數(shù)來實(shí)現(xiàn)

#coding=utf-8
import json
class Employee(object):
    def __init__(self,name,age,sex,tel):
        self.name = name
        self.age = age
        self.sex = sex
        self.tel = tel

    #將序列化函數(shù)定義到類里面
    def obj_json(self,obj_instance):
        return {   #返回一個(gè)字典
            'name' : obj_instance.name,
            'age' : obj_instance.age,
            'sex' : obj_instance.sex,
            'tel' : obj_instance.tel}

emp =Employee("Lily",24,"female","18212345678")
print(json.dumps(emp,default = emp.obj_json))#編碼成json對(duì)象

#coding=utf-8
import json
class Employee(object):
    def __init__(self,name,age,sex,tel):
        self.name = name
        self.age = age
        self.sex = sex
        self.tel = tel

    #將序列化函數(shù)定義到類里面
    def obj_json(self,obj_instance):
        return {
            'name' : obj_instance.name,
            'age' : obj_instance.age,
            'sex' : obj_instance.sex,
            'tel' : obj_instance.tel}

emp =Employee("Lily",24,"female","18212345678")
print(emp.__dict__)
print(json.dumps(emp,default=lambda Employee:Employee.__dict__))
print(json.dumps(emp,default = lambda emp:emp.__dict__))

Json反序列化為對(duì)象
json串反序列化成類對(duì)象或類的實(shí)例,使用的是loads()方法中的object_hook參數(shù)來實(shí)現(xiàn)

#coding=utf-8
import json
class Employee(object):
    def __init__(self,name,age,sex,tel):
        self.name = name
        self.age = age
        self.sex = sex
        self.tel = tel

#emp = Employee('Lily',24,'female','13112345678')

def jsonToClass(emp):
    return Employee(emp['name'],emp['age'],emp['sex'],emp['tel'])

json_str = '{"name":"Lucy","age":21,"sex":"female","tel":"13510163252"}'#需要反序列化的對(duì)象

e = json.loads(json_str,object_hook = jsonToClass)#通過loads反序列化得到對(duì)象e

print(e)
print(e.name)
向AI問一下細(xì)節(jié)
推薦閱讀:
  1. python3操作json
  2. Python Json

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI