程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python(進階篇)-json標准庫大總結

編輯:Python


活動地址:CSDN21天學習挑戰賽

學習的最大理由是想擺脫平庸,早一天就多一份人生的精彩;

雖然永遠無法預料明天是晴還是雨,

也無法預知你在乎的人是否還在身旁,

以及你一直以來的堅持究竟能否換來什麼。

但你能決定的是,

今天有沒有備好雨傘,

有沒有好好愛自己,

以及是否為自己追求的理想而拼盡全力。

目錄

  • json標准庫大總結
    • 一、什麼是json?
    • 二、json語法規則
    • 三、json模塊
      • json.dumps()
      • json.dump()
      • json.load()
    • 四、XML文件和JSON文件互轉
    • 五、解析json文件
    • json與js對象的關系

json標准庫大總結

一、什麼是json?

JSON(JavaScript Object Notation, JS對象簡譜)是一種輕量級的數據交換格式。它基於 ECMAScript(European Computer Manufacturers Association, 歐洲計算機協會制定的js規范)的一個子集,采用完全獨立於編程語言的文本格式來存儲和表示數據。簡潔和清晰的層次結構使得 JSON 成為理想的數據交換語言。 易於人閱讀和編寫,同時也易於機器解析和生成,並有效地提升網絡傳輸效率。

簡要歷史
JSON(JavaScript Object Notation)是一種輕量級的數據交換格式。易於人閱讀和編寫,可以在多種語言之間進行數據交換 [5] 。同時也易於機器解析和生成。它基於JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個子集。
JSON是Douglas Crockford在2001年開始推廣使用的數據格式,在2005年-2006年正式成為主流的數據格式,雅虎和谷歌就在那時候開始廣泛地使用JSON格式。

總結

  • json獨立於語言
  • json具有自我描述性,更易理解
  • json比XML更小、更快、更易解析
  • 在我們使用爬蟲獲取的接口數據就是json格式

二、json語法規則

語法格式{key1:value1,key2:value2}鍵值對形式(冒號分開),對間用逗號連接
范例:簡單的json對象

{

"name":"樣子的木偶",
"age":18
}

在實際運用中常常這樣表示一個對象

{
"name":"樣子的木偶","age":18}//同一個對象信息編寫在同一行節省空間

復雜范例:

{

"中國省份":[//使用數組包含兩個對象,每個對象用逗號分隔
{
"name":"台灣","位置":"東方"},//對象內每個鍵值對通過逗號分隔
{
"name":"河南","位置":"中原"}
]
}

注意事項

  • json的鍵值對key部分必須要使用包裹起來,單引號都不行,這樣key中二點值都成為了符號,在js中就沒有這樣的強制要求,但是js中要求key中不能包含關鍵字
  • json中的鍵值對value部分,不允許出現函數function、undefined、NaN,但是可以有null,js中對象的值中可以出現
  • json數據結束後、不允許出現沒有用的逗號如:{key:value,key2:value2,},注意看結尾部分value2的後面的逗號,不允許出現

json格式總結
可以是對象、數組、數字、字符串或者三個字面值(false、null、true)中的一個。值中的字面值中的英文必須使用小寫。

對象由花括號括起來的逗號分割的成員構成,成員是字符串鍵和上文所述的值由逗號分割的鍵值對組成,如:
{"name": "John Doe", "age": 18, "address": {"country" : "china", "zip-code": "10000"}}

JSON中的對象可以包含多個鍵值對,並且有數組結構,該語言正是一次實現過程內容的描述。

數組是由方括號括起來的一組值構成,如:[3, 1, 4, 1, 5, 9, 2, 6]

字符串與C或者Java的字符串非常相似。字符串是由雙引號包圍的任意數量Unicode字符的集合,使用反斜線轉義。一個字符(character)即一個單獨的字符串(character string)。

數字也與C或者Java的數值非常相似。除去未曾使用的八進制與十六進制格式。除去一些編碼細節。
json的正確使用方法

#格式1:json對象
{
"name":"樣子的木偶","age":18}//同一個對象信息編寫在同一行節省空間
#格式2:json數組
{

"中國省份":[//使用數組包含兩個對象,每個對象用逗號分隔
{
"name":"台灣","位置":"東方"},//對象內每個鍵值對通過逗號分隔
{
"name":"河南","位置":"中原"}
]
}

三、json模塊

作用

  • 使用json字符串生成python對象(load)
  • 由python對象格式化成為json字符串(dump)
    python到json數據類型轉換
    將數據從python轉換到json格式,在數據類型上會由變化,如下表:
pythonjsondictobjectlist,tuplearraystrstrigint,float,int-&float-derived EnumsnumberTruetrueFalsefalseNonenull

反過來,將json格式轉化為python內置類型,如下表所示:

jsonpythonobjectdictarrayliststringstrumber(int)intnumber(real)floattrueTruefalseFalsenullNone

使用方法

json模塊我們主要學會使用這四種方法就好

json.dumps(obj)//將python數據類型轉換為json格式的字符串。
josn.dump(obj,fp)//將python數據類型轉換並保存到son格式的文件內。
json.loads(s)//將json格式的字符串轉換為python的類型。
json.load(fp)//從json格式的文件中讀取數據並轉換為python的類型。

接下來我們分別介紹使用方法

json.dumps()

將python數據類型轉化為json格式的字符串

語法格式

  • json.dumps(obj, *,skipkeys=False,ensure_ascii=True,check_circular=True,allow_nan=True,cls=Mone,indent=HNone,separators=None,default=None,sort_keys=False,**kw)
import json
# Python字典
person = {
"name": "樣子的木偶", "age": 18, "tel": ["10086996", "1351111111"], "isonly": True}
print(person)
print(type(person))
# Python字典轉換為json字符串
jsonStr = json.dumps(person)
print(jsonStr )
print(type(jsonStr))

從上面可以看出json格式和python格式的區別:python格式打印輸出是單引號,類型為dict。而json格式輸出是雙引號,類型為:strTrue的開頭大小寫的區別

使用dumps()的一些參數可以將json字符串進行格式化輸出:

import json
# Python字典
person = {
"name": "樣子的木偶", "age": 18, "tel": ["10086996", "1351111111"], "isonly": True}
print(person)
print(type(person))
# Python字典轉換為json字符串
jsonStr = json.dumps(person,sort_keys=True, indent=4, separators=(',', ': '))
print(jsonStr )
print(type(jsonStr))


參數介紹

  • sort_key:是否進行排序
  • indent:定義縮進距離
  • separators:是一個元組,定義分隔符類型
  • skipkeys:是否允許json字符串編碼字典對象時,字典的key不是字符串類型(默認是不允許)

修改分隔符

import json
# Python字典
person = {
"name": "樣子的木偶", "age": 18, "tel": ["10086996", "1351111111"], "isonly": True}
print(person)
print(type(person))
# Python字典轉換為json字符串
jsonStr = json.dumps(person, sort_keys=True, indent=4, separators=('!', ': '))
print(jsonStr)
print(type(jsonStr))


文件操作

import json
# Python字典
person = {
"name": "樣子的木偶", "age": 18, "tel": ["10086996", "1351111111"], "isonly": True}
# Python字典轉換為json字符串
jsonStr = json.dumps(person)
print(jsonStr)
print(type(jsonStr))
with open('test.json', 'w', encoding='utf-8') as f: # 文件名/寫入/編碼類型
f.write(jsonStr) # 在文件裡寫入轉成的json串


創建了text.json文件並寫入內容

json.dump()

語法格式

  • json.dump(obj,fp,*,skipkeys=False,ensure_ascii=True,check_circular=True, allow_nan=True,cls=None,indent=None,separators=None,default=None, sort_keys=False,**kw)
import json
# Python字典
person = {
"name": "樣子的木偶", "age": 18, "tel": ["10086996", "1351111111"], "isonly": True}
# Python字典轉換為json字符串
jsonStr = json.dumps(person)
json.dump(person, open('text.json', 'w'))


使用參數能讓json字串格式化輸出:

import json
# Python字典
person = {
"name": "樣子的木偶", "age": 18, "tel": ["10086996", "1351111111"], "isonly": True}
# Python字典轉換為json字符串
jsonStr = json.dumps(person)
json.dump(person, open('text.json', 'w'), sort_keys=True, indent=4, separators=(',', ': '))


json.dumps和json.dumps寫入文件的區別:

  • dump()不需要使用.write()方法,只需要寫那個字典,那個文件即可;而dumps()需要使用.wnite()方法寫
  • 如果把字典寫到文件裡面的時候,dump()好用;但是如果不需要操作文件,或需要把內容存儲到數據庫何excel,則需要使用dumps()先把字典轉換成字符串,再寫入

json.load()

使json格式的文件中的數據類型轉換為python中的類型

  • 語法格式: json.load(fp," , cls=Mone, object_hook=None,parse_float=NMone, parse_int=None, parse_constant=None,object_pairs_hook=None,**kw)
import json
python= json.load(open('text.json','r'))
print(python)
print(type(python))


json.load()和json.loads()區別

  • loads()傳的是json字符串,而load()傳的是文件對象
  • 使用loads()時需要先讀取文件再使用,而load()則不用
    總結
    我們可以發現不管dumps還是load,帶s的都是和字符串相關的,不帶s的都是和文件相關的

四、XML文件和JSON文件互轉

**XML文件轉為JSON文件
新建一個text.xml文件:

<note date="23/04/2022">
<to>tom</to>
<from>mary</from>
<msg>love</msg>
</note>


import json
import xmltodict
def xml_to_json(xml_str):
"""parse是的xml解析器,參數需要 :param xml_str: xml字符串 :return: json字符串 """
xml_parse = xmltodict.parse(xml_str)
# json庫dumps()是將dict轉化成json格式,loads()是將json轉化成dict格式。
# dumps()方法的ident=1,格式化json
json_str = json.dumps(xml_parse, indent=1)
return json_str
XML_PATH = './text.xml' # xml文件的路徑
with open(XML_PATH, 'r') as f:
xmlfile = f.read()
with open(XML_PATH[:-3] + 'json', 'w') as newfile:
newfile.write(xml_to_json(xmlfile))


成功寫入json文件
json文件轉換為xml文件
新建text.json文件:

{

"student": {

"course": {

"name": "math",
"score": "90"
},
"info": {

"sex": "male",
"name": "name"
},
"stid": "10213"
}
}


轉換代碼

import xmltodict
import json
def json_to_xml(python_dict):
"""xmltodict庫的unparse()json轉xml :param python_dict: python的字典對象 :return: xml字符串 """
xml_str = xmltodict.unparse(python_dict)
return xml_str
JSON_PATH = './text.json' # json文件的路徑
with open(JSON_PATH, 'r') as f:
jsonfile = f.read()
python_dict = json.loads(jsonfile) # 將json字符串轉換為python字典對象
with open(JSON_PATH[:-4] + 'xml', 'w') as newfile:
newfile.write(json_to_xml(python_dict))


生成xml文件
json和xml的區別
1、可讀性

JSON和XML的可讀性可謂不相上下,一邊是簡易的語法,一邊是規范的標簽形式,很難分出勝負。
可擴展性

XML天生有很好的擴展性,JSON當然也有,沒有什麼是XML可以擴展而JSON卻不能擴展的。不過JSON在Javascript主場作戰,可以存儲Javascript復合對象,有著xml不可比擬的優勢。

2、編碼難度

XML有豐富的編碼工具,比如Dom4j、Dom、SAX等,JSON也有提供的工具。無工具的情況下,相信熟練的開發人員一樣能很快的寫出想要的xml文檔和JSON字符串,不過,xml文檔要多很多結構上的字符。
3、解碼難度

XML的解析方式有兩種:
一是通過文檔模型解析,也就是通過父標簽索引出一組標記。例如:xmlData.getElementsByTagName(“tagName”),但是這樣是要在預先知道文檔結構的情況下使用,無法進行通用的封裝。

另外一種方法是遍歷節點(document 以及 childNodes)。這個可以通過遞歸來實現,不過解析出來的數據仍舊是形式各異,往往也不能滿足預先的要求。

凡是這樣可擴展的結構數據解析起來一定都很困難。

JSON也同樣如此。如果預先知道JSON結構的情況下,使用JSON進行數據傳遞簡直是太美妙了,可以寫出很實用美觀可讀性強的代碼。如果你是純粹的前台開發人員,一定會非常喜歡JSON。但是如果你是一個應用開發人員,就不是那麼喜歡了,畢竟xml才是真正的結構化標記語言,用於進行數據傳遞。

而如果不知道JSON的結構而去解析JSON的話,那簡直是噩夢。費時費力不說,代碼也會變得冗余拖沓,得到的結果也不盡人意。但是這樣也不影響眾多前台開發人員選擇JSON。因為json.js中的toJSONString()就可以看到JSON的字符串結構。當然對於不是經常使用這個字符串的人,這樣做仍舊是噩夢。常用JSON的人看到這個字符串之後,就對JSON的結構很明了了,就更容易的操作JSON。

以上是在Javascript中僅對於數據傳遞的xml與JSON的解析。在Javascript地盤內,JSON畢竟是主場作戰,其優勢當然要遠遠優越於xml。如果JSON中存儲Javascript復合對象,而且不知道其結構的話,我相信很多程序員也一樣是哭著解析JSON的。

除了上述之外,JSON和XML還有另外一個很大的區別在於有效數據率。JSON作為數據包格式傳輸的時候具有更高的效率,這是因為JSON不像XML那樣需要有嚴格的閉合標簽,這就讓有效數據量與總數據包比大大提升,從而減少同等數據流量的情況下,網絡的傳輸壓力。

五、解析json文件

解析json文件其實就是定位到所需數據的鍵即可

代碼實現

import json
json_str = '{"name":"test", "type":{"name":"seq", "parameter":["1", "2"]}}'
print(json_str)
print(type(json_str))
print('-' * 20)
# 1、JSON文件轉換為Python對象
python_obj = json.loads(json_str)
print(python_obj)
print(type(python_obj))
print('-' * 20)
# 2、定位具體的數據節點
print(python_obj.keys())
print(python_obj.values())
print(python_obj["name"])
print(python_obj["type"]["name"])
print(python_obj["type"]["parameter"][0])
print(python_obj["type"]["parameter"][1])

輸出結果

解析json文件
新建text.json文件

{

"student": {

"course": {

"name": "math",
"score": "90"
},
"info": {

"sex": "male",
"name": "name"
},
"stid": "10213"
}
}

解析代碼實現

import json
# 1、JSON文件轉換為Python對象
python_obj = json.load(open('test.json', 'r'))
print(python_obj)
print(type(python_obj))
print("-" * 20)
# 2、解析json文件
# 輸出cours節點e下的數據
print(python_obj['student']['course']['name']) # 輸出name
print(python_obj['student']['course']['score']) # 輸出score
# 輸出info節點下的數據
print(python_obj['student']['info']['sex']) # 輸出sex
print(python_obj['student']['info']['name']) # 輸出name
# 輸出stid節點下的數據
print(python_obj['student']['stid']) # 輸出stid

解析結果

json與js對象的關系

很多人搞不清楚 JSON 和 JS 對象的關系,甚至連誰是誰都不清楚。其實,可以這麼理解:

JSON 是 JS 對象的字符串表示法,它使用文本表示一個 JS 對象的信息,本質是一個字符串。

var obj = {
a: 'Hello', b: 'World'}; //這是一個對象,注意鍵名也是可以使用引號包裹的
var json = '{"a": "Hello", "b": "World"}'; //這是一個 JSON 字符串,本質是一個字符串

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved