Python讀寫(xiě)JSON文件的操作詳解
JSON
JSON 起源
JSON 全稱(chēng) JavaScript Object Notation 。是處理對(duì)象文字語(yǔ)法的 JavaScript 編程語(yǔ)言的一個(gè)子集。JSON 早已成為與語(yǔ)言無(wú)關(guān)的語(yǔ)言,并作為自己的標(biāo)準(zhǔn)存在。
JSON 樣例
{
"data":[
{
"id": "1",
"name": "A同學(xué)",
"state": "1",
"createTime": "2020-01-21"
},
{
"id": "2",
"name": "B同學(xué)",
"state": "1",
"createTime": "2020-01-21"
},
{
"id": "3",
"name": "C同學(xué)",
"state": "0",
"createTime": "2020-01-21"
}
]
}
Python 原生支持 JSON
Python 帶有一個(gè)內(nèi)置包 json,用于對(duì) JSON 數(shù)據(jù)進(jìn)行編碼和解碼。

引用方式。
import json
JSON 編碼的過(guò)程通常稱(chēng)為序列化。該術(shù)語(yǔ)是指將數(shù)據(jù)轉(zhuǎn)換為一系列字節(jié)通過(guò)網(wǎng)絡(luò)存儲(chǔ)或傳輸。反序列化是解碼以 JSON 標(biāo)準(zhǔn)存儲(chǔ)或交付的數(shù)據(jù)的交互過(guò)程。
序列化 JSON
直觀的轉(zhuǎn)換將簡(jiǎn)單的 Python 對(duì)象轉(zhuǎn)換為 JSON。
| Python | JSON |
|---|---|
| dict | object |
| list,tuple | array |
| str | string |
| int, long,float | number |
| True | true |
| False | false |
| None | null |
簡(jiǎn)單的序列化示例
創(chuàng)建一個(gè)簡(jiǎn)單的數(shù)據(jù)。
data = {
"data":[
{
"id": "1",
"name": "A同學(xué)",
"state": "1",
"createTime": "2020-01-21"
},
{
"id": "2",
"name": "B同學(xué)",
"state": "1",
"createTime": "2020-01-21"
},
{
"id": "3",
"name": "C同學(xué)",
"state": "0",
"createTime": "2020-01-21"
}
]
}
數(shù)據(jù)直接以文本方式保存。
with open("data_file.json", "w") as f:
json.dump(data, f)
數(shù)據(jù)直接以字符串方式使用。
json_str = json.dumps(data)
JSON 反序列化
在 json 庫(kù)中使用 load() 和 oads() 用于將 JSON 編碼數(shù)據(jù)轉(zhuǎn)換為 Python 對(duì)象。
| JSON | Python |
|---|---|
| object | dict |
| array | list |
| string | str |
| number(整數(shù)) | int |
| number(浮點(diǎn)數(shù)) | float |
| true | True |
| false | False |
| null | None |
簡(jiǎn)單的反序列化示例
讀取寫(xiě)入json文件的數(shù)據(jù)。
with open("data_file.json", "r") as read_file:
data = json.load(read_file)
字符串?dāng)?shù)據(jù)。
json_string = """
{
"data":[
{
"id": "1",
"name": "A同學(xué)",
"state": "1",
"createTime": "2020-01-21"
},
{
"id": "2",
"name": "B同學(xué)",
"state": "1",
"createTime": "2020-01-21"
},
{
"id": "3",
"name": "C同學(xué)",
"state": "0",
"createTime": "2020-01-21"
}
]
}
"""
data = json.loads(json_string)
應(yīng)用案例
通過(guò)互聯(lián)網(wǎng)的數(shù)據(jù)抓取解析文本信息。
# 秦皇島煤炭網(wǎng)微博
import requests
from bs4 import BeautifulSoup
import datetime
url = "http://news.cqcoal.com/manage/newsaction.do?method:webListPageNewsArchivesByTypeid"
post_param = {'pageNum':'1','pageSize':'20','jsonStr':'{"typeid":"238"}'}
return_data = requests.post(url,data =post_param)
return_data = return_data.content.decode("utf-8")
import json
for i in json.loads(return_data)["rows"]:
title = i["title"]
url = "http://news.cqcoal.com/blank/nc.jsp?mid="+str(i["id"])
timeStamp=int(i["pubdate"])
dateArray = datetime.datetime.utcfromtimestamp(timeStamp)
date = dateArray.strftime("%Y-%m-%d")
print(title,url,date)

編碼和解碼
自定義數(shù)據(jù)。
import json
# 基礎(chǔ)的數(shù)字字典
py_object = {"c": 0, "b": 0, "a": 0}
# JSON 編碼
json_string = json.dumps(py_object)
print(json_string)
print(type(json_string))
{"c": 0, "b": 0, "a": 0}
<class 'str'>
# JSON 解碼
py_obj = json.loads(json_string)
print(py_obj)
print(type(py_obj))
{'c': 0, 'b': 0, 'a': 0}
<class 'dict'>
如果遇到 TypeError: Object of type SampleClass is not JSON serializable 的錯(cuò)誤就需要自定義編碼和解碼了。
import json
class Student:
def __init__(self, name, roll_no, address):
self.name = name
self.roll_no = roll_no
self.address = address
def to_json(self):
'''
將此類(lèi)的實(shí)例轉(zhuǎn)換為 json
'''
return json.dumps(self, indent = 4, default=lambda o: o.__dict__)
class Address:
def __init__(self, city, street, pin):
self.city = city
self.street = street
self.pin = pin
address = Address("Bulandshahr", "Adarsh Nagar", "203001")
student = Student("Raju", 53, address)
# 編碼
student_json = student.to_json()
print(student_json)
print(type(student_json))
{
"name": "Raju",
"roll_no": 53,
"address": {
"city": "Bulandshahr",
"street": "Adarsh Nagar",
"pin": "203001"
}
}
<class 'str'>
# 解碼
student = json.loads(student_json)
print(student)
print(type(student))
{'name': 'Raju', 'roll_no': 53, 'address': {'city': 'Bulandshahr', 'street': 'Adarsh Nagar', 'pin': '203001'}}
<class 'dict'>
以上就是Python讀寫(xiě)JSON文件的操作詳解的詳細(xì)內(nèi)容,更多關(guān)于Python讀寫(xiě)JSON的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python存取XML的常見(jiàn)方法實(shí)例分析
這篇文章主要介紹了Python存取XML的常見(jiàn)方法,結(jié)合具體實(shí)例形式較為詳細(xì)的分析了Python存取xml的常用方法、優(yōu)缺點(diǎn)比較與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-03-03
解決Python pandas plot輸出圖形中顯示中文亂碼問(wèn)題
今天小編就為大家分享一篇解決Python pandas plot輸出圖形中顯示中文亂碼問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
python使用xlrd與xlwt對(duì)excel的讀寫(xiě)和格式設(shè)定
最近在用python處理excel表的時(shí)候出現(xiàn)了一些問(wèn)題,所以想著記錄下最后的實(shí)現(xiàn)方式和問(wèn)題解決方法。方便自己或者大家在有需要的時(shí)候參考借鑒,下面這篇文章主要就介紹了python使用xlrd與xlwt對(duì)excel的讀寫(xiě)和格式設(shè)定的相關(guān)資料,一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。2017-01-01
解讀MaxPooling1D和GlobalMaxPooling1D的區(qū)別
這篇文章主要介紹了MaxPooling1D和GlobalMaxPooling1D的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Python 解決相對(duì)路徑問(wèn)題:"No such file or directory"
這篇文章主要介紹了Python 解決相對(duì)路徑問(wèn)題:"No such file or directory"具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
使用wxPython獲取系統(tǒng)剪貼板中的數(shù)據(jù)的教程
這篇文章主要介紹了使用wxPython獲取系統(tǒng)剪貼板中的數(shù)據(jù)的教程,wxPython是一個(gè)非常受歡迎的Python圖形庫(kù),需要的朋友可以參考下2015-05-05

