python之json格式解析與轉(zhuǎn)換方式
python json格式解析與轉(zhuǎn)換
使用Python標(biāo)準(zhǔn)庫(kù): json 實(shí)現(xiàn)json格式字符串與Python對(duì)象的互轉(zhuǎn)。
但注意,只有有效的json格式字符串才能夠轉(zhuǎn)換為Python對(duì)象。
OK,問(wèn)題來(lái)了,什么叫有效的json格式字符串?
- 字符串必須用雙引號(hào)
- 在同一個(gè)對(duì)象中,所有的鍵必須是唯一的
- 最后一個(gè)元素后面不應(yīng)有逗號(hào)
- 字符串中不應(yīng)包含注釋
1、json格式字符串轉(zhuǎn)python類型
主要用到兩個(gè)函數(shù):
- json.loads()
- loads為'load string'的縮寫,用來(lái)解析json格式的字符串(該字符串要包含有效的json數(shù)據(jù)),返回python對(duì)象(列表或字典)
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)}')
# 轉(zhuǎn)為python類型之后,比如轉(zhuǎn)為python字典,我們就可以使用dict相關(guān)方法進(jìn)行數(shù)據(jù)的提取等操作
- json.load()
- load用于從一個(gè)文件中讀取json數(shù)據(jù),接收一個(gè)文件對(duì)象,返回一個(gè)python對(duì)象
如讀取txt文件中存儲(chǔ)的字符串形式的json數(shù)據(jù),如下圖

import json
# open函數(shù)返回一個(gè)文件對(duì)象,并將其賦給f
with open(r'test_json.txt', 'r') as f:
json_content = json.load(f)
print(json_content)
print(type(json_content))2、python對(duì)象轉(zhuǎn)為json格式字符串
主要用到兩個(gè)函數(shù):
- json.dumps
- dumps為'dump string'的縮寫,用于將python對(duì)象轉(zhuǎn)為json格式的字符串
import json
# python對(duì)象
data_list = [1, 2, 3]
data_dict = {"name": ["Alice", "Bob"], "age": [25, 30]}
# 轉(zhuǎn)為json對(duì)象
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 對(duì)象轉(zhuǎn)換為json格式,并將結(jié)果寫入文件,它需要一個(gè)文件對(duì)象作為輸出目標(biāo)
import json
data_dict = {"name": ["Alice", "Bob"], "age": [25, 30]}
# 創(chuàng)建一個(gè)test_json.json文件(w: 文件不存在則創(chuàng)建)
with open(r'test_json.json', 'w') as f:
# indent: 該參數(shù)用來(lái)控制縮進(jìn) 用來(lái)美化json使其有清晰的層次結(jié)構(gòu)
json.dump(data_dict, f, indent=4)
3、json轉(zhuǎn)DataFrame
直接使用pd.read_json函數(shù)讀取json格式字符串、json文件,然后轉(zhuǎn)為DataFrame
import pandas as pd
from io import StringIO
# 讀取JSON數(shù)據(jù)為DataFrame對(duì)象
json_data = '{"name": ["Alice", "Bob"], "age": [25, 30]}'
# read_json 函數(shù)通常期望接收一個(gè)文件路徑或文件對(duì)象,而不是字符串,
# 所以這里使用了StringIO 來(lái)將字符串json_data 轉(zhuǎn)換成一個(gè)類似文件的對(duì)象,這樣read_json 就可以從中讀取數(shù)據(jù)
df = pd.read_json(StringIO(json_data))
df或直接讀取json文件
import pandas as pd data = pd.read_json(r'test_json.json') data
4、DataFrame轉(zhuǎn)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'可將時(shí)間戳轉(zhuǎn)換為以秒為單位的時(shí)間戳部分輸出結(jié)果如下,

同時(shí)可以使用orient(其參數(shù)可以?。簊plit、records、index、columns、values、table)參數(shù)改變輸出數(shù)據(jù)結(jié)構(gòu),大家可以嘗試一下各個(gè)參數(shù)取值出來(lái)的效果,下面展示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')部分輸出結(jié)果如下,輸出是一個(gè) JSON 對(duì)象數(shù)組,其中每個(gè)對(duì)象對(duì)應(yīng) DataFrame 的一行。

同時(shí)注意到,時(shí)間格式在轉(zhuǎn)為json之后,變成了時(shí)間戳,怎么保留原來(lái)的時(shí)間格式呢?
那就需要在轉(zhuǎn)為json之前,先把時(shí)間格式轉(zhuǎn)為字符串格式,再轉(zhuǎn)為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')部分輸出結(jié)果為,

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
舉例講解Python的Tornado框架實(shí)現(xiàn)數(shù)據(jù)可視化的教程
這篇文章主要介紹了舉例講解Python的Tornado框架實(shí)現(xiàn)數(shù)據(jù)可視化的教程,Tornado是一個(gè)異步的高人氣開發(fā)框架,需要的朋友可以參考下2015-05-05
Mysql數(shù)據(jù)庫(kù)反向生成Django里面的models指令方式
這篇文章主要介紹了Mysql數(shù)據(jù)庫(kù)反向生成Django里面的models指令方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05
Python面向?qū)ο蠡A(chǔ)入門之設(shè)置對(duì)象屬性
這篇文章主要給大家介紹了關(guān)于Python面向?qū)ο蠡A(chǔ)入門之設(shè)置對(duì)象屬性的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12
flask中使用SQLAlchemy進(jìn)行輔助開發(fā)的代碼
在Web.py, Django, Flask, Tornado里,自帶的ORM功能比較缺乏,推薦大家使用SQLAlchemy來(lái)輔助開發(fā)2013-02-02

