首頁 > 軟體

Python讀寫JSON檔案的操作詳解

2022-04-12 16:00:05

JSON

JSON 起源

JSON 全稱 JavaScript Object Notation 。是處理物件文字語法的 JavaScript 程式語言的一個子集。JSON 早已成為與語言無關的語言,並作為自己的標準存在。

JSON 樣例

{
	 "data":[
	  {
	    "id": "1",
	    "name": "A同學",
	    "state": "1",
	    "createTime": "2020-01-21"
	  },
	  {
	    "id": "2",
	    "name": "B同學",
	    "state": "1",
	    "createTime": "2020-01-21"
	  },
	  {
	    "id": "3",
	    "name": "C同學",
	    "state": "0",
	    "createTime": "2020-01-21"
	  }
	]
}

Python 原生支援 JSON

Python 帶有一個內建包 json,用於對 JSON 資料進行編碼和解碼。

參照方式。

import json

JSON 編碼的過程通常稱為序列化。該術語是指將資料轉換為一系列位元組通過網路儲存或傳輸。反序列化是解碼以 JSON 標準儲存或交付的資料的互動過程。

序列化 JSON

直觀的轉換將簡單的 Python 物件轉換為 JSON。

PythonJSON
dictobject
list,tuplearray
strstring
int, long,floatnumber
Truetrue
Falsefalse
Nonenull

簡單的序列化範例

建立一個簡單的資料。

data =   {
	 "data":[
	  {
	    "id": "1",
	    "name": "A同學",
	    "state": "1",
	    "createTime": "2020-01-21"
	  },
	  {
	    "id": "2",
	    "name": "B同學",
	    "state": "1",
	    "createTime": "2020-01-21"
	  },
	  {
	    "id": "3",
	    "name": "C同學",
	    "state": "0",
	    "createTime": "2020-01-21"
	  }
	]
}

資料直接以文字方式儲存。

with open("data_file.json", "w") as f:
    json.dump(data, f)

資料直接以字串方式使用。

json_str = json.dumps(data)

JSON 反序列化

在 json 庫中使用 load() 和 oads() 用於將 JSON 編碼資料轉換為 Python 物件。

JSONPython
objectdict
arraylist
stringstr
number(整數)int
number(浮點數)float
trueTrue
falseFalse
nullNone

簡單的反序列化範例

讀取寫入json檔案的資料。

with open("data_file.json", "r") as read_file:
    data = json.load(read_file)

字串資料。

json_string = """
{
	 "data":[
	  {
	    "id": "1",
	    "name": "A同學",
	    "state": "1",
	    "createTime": "2020-01-21"
	  },
	  {
	    "id": "2",
	    "name": "B同學",
	    "state": "1",
	    "createTime": "2020-01-21"
	  },
	  {
	    "id": "3",
	    "name": "C同學",
	    "state": "0",
	    "createTime": "2020-01-21"
	  }
	]
}
"""
data = json.loads(json_string)

應用案例

通過網際網路的資料抓取解析文字資訊。

# 秦皇島煤炭網微博
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)

編碼和解碼

自定義資料。

import json

# 基礎的數位字典
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 的錯誤就需要自定義編碼和解碼了。

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):
		'''
		將此類的範例轉換為 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讀寫JSON檔案的操作詳解的詳細內容,更多關於Python讀寫JSON的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com