python之json格式解析與轉換方式
python json格式解析與轉換
使用Python標準庫: json 實現(xiàn)json格式字符串與Python對象的互轉。
但注意,只有有效的json格式字符串才能夠轉換為Python對象。
OK,問題來了,什么叫有效的json格式字符串?
- 字符串必須用雙引號
- 在同一個對象中,所有的鍵必須是唯一的
- 最后一個元素后面不應有逗號
- 字符串中不應包含注釋
1、json格式字符串轉python類型
主要用到兩個函數(shù):
- json.loads()
- loads為'load string'的縮寫,用來解析json格式的字符串(該字符串要包含有效的json數(shù)據),返回python對象(列表或字典)
import json
# json格式的字符串 可解析為python列表
json_data_list = '[{"name": ["Alice", "Bob"], "age": [25, 30]}]'
# json格式的字符串 可解析為python字典
json_data_dict = '{"name": ["Alice", "Bob"], "age": [25, 30]}'
# 解析json格式的字符串
parse_json_data_list = json.loads(json_data_list)
parse_json_data_dict = json.loads(json_data_dict)
print(f'json_data_list的類型為: {type(json_data_list)}; parse_json_data_list的類型為: {type(parse_json_data_list)}')
print(f'json_data_dict的類型為: {type(json_data_dict)}; parse_json_data_dict的類型為: {type(parse_json_data_dict)}')
# 轉為python類型之后,比如轉為python字典,我們就可以使用dict相關方法進行數(shù)據的提取等操作
- json.load()
- load用于從一個文件中讀取json數(shù)據,接收一個文件對象,返回一個python對象
如讀取txt文件中存儲的字符串形式的json數(shù)據,如下圖

import json
# open函數(shù)返回一個文件對象,并將其賦給f
with open(r'test_json.txt', 'r') as f:
json_content = json.load(f)
print(json_content)
print(type(json_content))2、python對象轉為json格式字符串
主要用到兩個函數(shù):
- json.dumps
- dumps為'dump string'的縮寫,用于將python對象轉為json格式的字符串
import json
# python對象
data_list = [1, 2, 3]
data_dict = {"name": ["Alice", "Bob"], "age": [25, 30]}
# 轉為json對象
json_data_list = json.dumps(data_list)
json_data_dict = json.dumps(data_dict)
print(f'data_list的類型為: {type(data_list)}; json_data_list的類型為: {type(json_data_list)}')
print(f'data_dict的類型為: {type(data_dict)}; json_data_dict的類型為: {type(json_data_dict)}')
- json.dump
- dump用于將 python 對象轉換為json格式,并將結果寫入文件,它需要一個文件對象作為輸出目標
import json
data_dict = {"name": ["Alice", "Bob"], "age": [25, 30]}
# 創(chuàng)建一個test_json.json文件(w: 文件不存在則創(chuàng)建)
with open(r'test_json.json', 'w') as f:
# indent: 該參數(shù)用來控制縮進 用來美化json使其有清晰的層次結構
json.dump(data_dict, f, indent=4)
3、json轉DataFrame
直接使用pd.read_json函數(shù)讀取json格式字符串、json文件,然后轉為DataFrame
import pandas as pd
from io import StringIO
# 讀取JSON數(shù)據為DataFrame對象
json_data = '{"name": ["Alice", "Bob"], "age": [25, 30]}'
# read_json 函數(shù)通常期望接收一個文件路徑或文件對象,而不是字符串,
# 所以這里使用了StringIO 來將字符串json_data 轉換成一個類似文件的對象,這樣read_json 就可以從中讀取數(shù)據
df = pd.read_json(StringIO(json_data))
df或直接讀取json文件
import pandas as pd data = pd.read_json(r'test_json.json') data
4、DataFrame轉json
import pandas as pd
data = pd.DataFrame(
{
'value': range(10),
'time': pd.date_range('2024-01-01', freq='D', periods=10),
'flag': list('abcdefghij')
}
)
data.to_json('test_to_json.json', indent=4)
# data.to_json('test_to_json.json', indent=4, date_unit='s') date_unit='s'可將時間戳轉換為以秒為單位的時間戳部分輸出結果如下,

同時可以使用orient(其參數(shù)可以?。簊plit、records、index、columns、values、table)參數(shù)改變輸出數(shù)據結構,大家可以嘗試一下各個參數(shù)取值出來的效果,下面展示orient='records'的輸出效果。
import pandas as pd
data = pd.DataFrame(
{
'value': range(10),
'time': pd.date_range('2024-01-01', freq='D', periods=10),
'flag': list('abcdefghij')
}
)
data.to_json('test_to_json.json', indent=4, orient='records')部分輸出結果如下,輸出是一個 JSON 對象數(shù)組,其中每個對象對應 DataFrame 的一行。

同時注意到,時間格式在轉為json之后,變成了時間戳,怎么保留原來的時間格式呢?
那就需要在轉為json之前,先把時間格式轉為字符串格式,再轉為json
import pandas as pd
data = pd.DataFrame(
{
'value': range(10),
'time': pd.date_range('2024-01-01', freq='D', periods=10),
'flag': list('abcdefghij')
}
)
data['time'] = data['time'].astype(str)
data.to_json('test_to_json.json', indent=4, orient='records')部分輸出結果為,

總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
舉例講解Python的Tornado框架實現(xiàn)數(shù)據可視化的教程
這篇文章主要介紹了舉例講解Python的Tornado框架實現(xiàn)數(shù)據可視化的教程,Tornado是一個異步的高人氣開發(fā)框架,需要的朋友可以參考下2015-05-05
Mysql數(shù)據庫反向生成Django里面的models指令方式
這篇文章主要介紹了Mysql數(shù)據庫反向生成Django里面的models指令方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
flask中使用SQLAlchemy進行輔助開發(fā)的代碼
在Web.py, Django, Flask, Tornado里,自帶的ORM功能比較缺乏,推薦大家使用SQLAlchemy來輔助開發(fā)2013-02-02

