Python讀寫(xiě)JSON文件的操作詳解
JSON
JSON 起源
JSON 全稱 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ò)程通常稱為序列化。該術(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):
'''
將此類的實(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)文章
numpy和tensorflow中的各種乘法(點(diǎn)乘和矩陣乘)
這篇文章主要介紹了numpy和tensorflow中的各種乘法(點(diǎn)乘和矩陣乘),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
如何使用Django默認(rèn)的Auth權(quán)限管理系統(tǒng)
本文主要介紹了如何使用Django默認(rèn)的Auth權(quán)限管理系統(tǒng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
Anaconda最新版2023安裝教程Spyder安裝教程圖文詳解
這篇文章主要介紹了Anaconda最新版2023安裝教程Spyder安裝教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
Django框架cookie和session方法及參數(shù)設(shè)置
這篇文章主要為大家介紹了Django框架cookie和session參數(shù)設(shè)置及介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
Python創(chuàng)建7種不同的文件格式的方法總結(jié)
今天的這篇文章呢,小編來(lái)介紹一下如何通過(guò)Python來(lái)創(chuàng)建各種形式的文件,這里包括了:文本文件、CSV文件、Excel文件、壓縮文件、XML文件、JSON文件和PDF文件,需要的可以參考一下2023-01-01

