python读取和保存json文件

json是一种结构化数据的方式,通常用于保存信息。

json基本语法

json的语法看起来像一个带有键值对的 JavaScript 对象字面。

基本语法规则:

  • 数据在名称/值对中

  • 数据由逗号 , 分隔

  • 使用斜杆 \来转义字符

  • 大括号 {} 保存对象

  • 中括号 [] 保存数组,数组可以包含多个对象

名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值:

1
"name" : "菜鸟教程"

值可以是:

  • 数字(整数或浮点数),不需要双引号
  • 字符串(在双引号中),需要双引号
  • 逻辑值(true 或 false),不要双引号
  • 数组(在中括号中),需要中括号
  • 对象(在大括号中),需要大括号
  • null

数组

JSON 数组在中括号 [] 中书写:

数组可包含多个对象:

1
2
3
4
5
6
7
{
"sites": [
{ "name":"菜鸟教程" , "url":"www.runoob.com" },
{ "name":"google" , "url":"www.google.com" },
{ "name":"微博" , "url":"www.weibo.com" }
]
}

python读取json文件

python中有一个内置的模块,可以直接导入。

1
import json

使用json.loads()可以将json文件解析为python字典。

假设有一个名字为fcc.json的文件,如果想用python打开并读取,需要先使用python内置的open()函数,使用with关键字保证文件被正确关闭。

1
with open('fcc.json', 'r') as fcc_file:

然后就可以使用

1
fcc_data = json.load(fcc_file)

完整实例代码:

1
2
3
4
5
import json

with open('fcc.json', 'r') as fcc_file:
fcc_data = json.load(fcc_file)
print(fcc_data)

可以用get(名称)的方法来获取键值。

比如data.get("speed_gate")

python写入json数据

与读取 JSON 数据类似,Python 中写入 JSON 数据也非常容易。可以使用 json 模块中的 dump()dumps() 函数来实现。dump() 用于将数据写入文件,而 dumps() 用于将数据转换为 JSON 字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
def savePara(self,evt):
path = os.path.join(os.path.dirname(__file__), "paraments.json")

try:
# 从UI读取并更新实例变量
self.speed_gate = self._get_int_from_entry(self.ui.tk_input_mls4siet, "速度阈值")
self.move_speed = self._get_int_from_entry(self.ui.tk_input_mls509yg, "移动速度")
self.move_position = self._get_int_from_entry(self.ui.tk_input_mls50t88, "移动位置")
self.click_speed = self._get_int_from_entry(self.ui.tk_input_mls5233r, "点动速度")
self.pos_limit_min = self._get_int_from_entry(self.ui.tk_input_mls55le5, "最小限位")
self.pos_limit_max = self._get_int_from_entry(self.ui.tk_input_mls562rl, "最大限位")

data = {
"speed_gate": self.speed_gate,
"move_speed": self.move_speed,
"move_position": self.move_position,
"click_speed": self.click_speed,
"pos_limit_min": self.pos_limit_min,
"pos_limit_max": self.pos_limit_max,
}

with open(path, "w", encoding="utf-8") as f:
json.dump(data, f, indent=4, ensure_ascii=False)

messagebox.showinfo("保存参数", f"保存成功:\n{path}", parent=self.ui)
print("保存参数成功:", data)

except Exception as e:
messagebox.showerror("保存参数失败", str(e), parent=self.ui)
raise