【JSON Python篇】通过代码操作 JSON

使用Python的json模块将JSON字符串转换为Python对象 在Python编程中,有时候我们需要将JSON(JavaScript Object Notation)字符串转换为Python中的对象,以便进行后续的数据处理和操作。json模块提供了一组用于处理JSON数据的方法和函数,其中包括将JSON字符串转换为Python对象的功能。,其中包含了一个名为"name"的键和相应的值"John",一个名为"age"的键和相应的值30,以及一个名为"city"的键和相应的值"New York"。函数,json模块还提供了其他一些方法和函数,用于处理JSON数据。 阅读详情

基础内容可以参考:【JSON小白篇】数据交换的通用语言—JSON

Python dict 和 JSON 字符串之间的双向转换,dumps 把字典"倒出来"变成字符串,loads 把字符串"装回去"变成字典。

​ Python 的 json 模块是标准库的一部分,不需要 pip install,直接 import json 就能用。

一、核心就四个函数

​ 先说名字。dump 的英文本意是"倾倒、卸货",像翻斗车把一车沙子哗地倒出来。在编程里取的就是这个意象:把内存里的数据"倒出来"变成外部格式。反过来 load 就是"装货",把外部数据"装回"程序。
在这里插入图片描述

​ 这个比喻在整个计算机领域都通用:mysqldump 是把数据库倒出来,core dump 是把内存倒出来,tcpdump 是把网络包倒出来。

​ json 模块的 API 不少,但日常开发只需要四个:

函数方向输入 → 输出场景
json.dumps()Python → 字符串dict → str发给前端、存进 Redis
json.loads()字符串 → Pythonstr → dict解析请求体、读取存储
json.dump()Python → 文件dict → file写配置文件
json.load()文件 → Pythonfile → dict读配置文件

​ 怎么记?带 s 的处理字符串(string),不带 s 的处理文件(file)。

在这里插入图片描述

​ 四个函数分两对:dumps/loads 处理字符串,dump/load 处理文件。上面是序列化(Python → JSON),下面是反序列化(JSON → Python)。

二、dumps 和 loads:最常用的一对

2.1 把字典变成 JSON 字符串

import json

user = {"name": "zhangsan", "age": 28, "skills": ["Python", "Flask"]}
text = json.dumps(user)
print(f"dict to json = {text}")
print(f"type = {type(text)}")
dict to json = {"name": "zhangsan", "age": 28, "skills": ["Python", "Flask"]}
type = <class 'str'>

​ json.dumps 的返回值是一个普通的 Python 字符串。字典变成了一段符合 JSON 格式的文本,这个过程叫序列化(serialization)。

2.2 把 JSON 字符串变回字典

data = json.loads(text)
print(f"json to dict = {data}")
print(f"type = {type(data)}")
json to dict = {'name': 'zhangsan', 'age': 28, 'skills': ['Python', 'Flask']}
type = <class 'dict'>

​ json.loads 做的是反方向的事。把 JSON 字符串解析回 Python 对象。这叫反序列化(deserialization)。

​ 一来一回,数据没有丢失。这是 json 模块最基本的用法:程序里用字典,传出去用字符串,收回来再变字典。

2.3 不只是字典

​ dumps 不只能处理字典,列表也行:

json.dumps([1, 2, 3])          # '[1, 2, 3]'
json.dumps("hello")            # '"hello"'
json.dumps(42)                 # '42'
json.dumps(True)               # 'true'  ← 注意变成了小写
json.dumps(None)               # 'null'  ← 注意变成了 null

​ 只要是 JSON 支持的类型,都能转。不过实际开发中 99% 的情况都是在转字典或列表。

三、dump 和 load:读写文件

​ 和 dumps/loads 逻辑完全一样,只不过目标从字符串换成了文件:

3.1 写入文件

import json

config = {
    "debug": True,
    "port": 5000,
    "allowed_hosts": ["localhost", "127.0.0.1"]
}

with open("config.json", "w") as f:
    json.dump(config, f, indent=2)

​ 生成的 config.json:

{
  "debug": true,
  "port": 5000,
  "allowed_hosts": [
    "localhost",
    "127.0.0.1"
  ]
}

​ 注意两个自动转换:Python 的 True 变成了 JSON 的 true,列表的格式也自动处理了。你不需要关心这些差异,json 模块全部搞定。

3.2 读取文件

with open("config.json") as f:
    loaded = json.load(f)

print(f"port = {loaded['port']}")        # 5000
print(f"debug = {loaded['debug']}, type = {type(loaded['debug'])}") # <class 'bool'>  ← 自动转回 Python 的 True
port = 5000
debug = True, type = <class 'bool'>

​ 读回来之后类型也是对的,true 变回 True,数字还是数字,列表还是列表。

3.3 dump 和 dumps 的关系

​ 其实 dump 内部就是先调 dumps 拿到字符串,再写入文件。所以这两种写法效果一样:

# 方式一:直接用 dump
with open("config.json", "w") as f:
    json.dump(config, f, indent=2)

# 方式二:先 dumps 再手动写
with open("config.json", "w") as f:
    f.write(json.dumps(config, indent=2))

​ 既然一样,为什么要有 dump?因为处理大文件时 dump 可以边序列化边写入,不需要先在内存里生成完整的字符串。日常用哪个都行,但写文件用 dump 是更地道的写法。

四、三个你一定会用到的参数

dumps 和 dump 都支持这些参数。

4.1 indent:让输出好看

import json

user = {"name": "zhangsan", "age": 28, "skills": ["Python", "Flask"]}

# 默认:紧凑一行
print("===默认输出格式===")
print(json.dumps(user))

# 加了 indent=2:有缩进有换行
print("====美化后=====")
print(json.dumps(user, indent=2))

​ indent 的值是缩进的空格数。indent=2 就是每层缩进 2 个空格,indent=4 就是 4 个。

输出:

===默认输出格式===
{"name": "zhangsan", "age": 28, "skills": ["Python", "Flask"]}

====美化后=====
{
  "name": "zhangsan",
  "age": 28,
  "skills": [
    "Python",
    "Flask"
  ]
}

​ 什么时候加?给人看的时候加,给机器看的时候别加。 写配置文件、调试时 print 出来看,加 indent 让人舒服。发给前端、存进 Redis,不加,多余的空格和换行只会浪费带宽和内存。

4.2 ensure_ascii:让中文正常显示

data = {"城市": "北京", "人口": "2100万"}

print("====默认输出====")
print(json.dumps(data))

print("=====设置中文直接输出=====")
print(json.dumps(data, ensure_ascii=False))

​ 默认情况下,json.dumps 会把**所有非 ASCII 字符转成 \uXXXX 转义序列。这在技术上完全没问题,任何 JSON 解析器都能正确还原,但人读起来很痛苦**。加上 ensure_ascii=False 就能直接输出中文。

输出:

====默认输出====
{"\u57ce\u5e02": "\u5317\u4eac", "\u4eba\u53e3": "2100\u4e07"}
=====设置中文直接输出=====
{"城市": "北京", "人口": "2100万"}

​ 写文件的时候记得同时指定编码:

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

​ 写入的json文件如下:

{
  "城市": "北京",
  "人口": "2100万"
}

4.3 separators:控制紧凑程度

payload = {"user_id": 123, "name": "zhangsan"}

# 默认:逗号后有空格,冒号后有空格
print("====默认展示====")
print(json.dumps(payload))

# 紧凑格式:去掉所有多余空格
print("====紧凑格式====")
print(json.dumps(payload, separators=(",", ":")))

​ separators 接受一个元组 (逗号分隔符, 冒号分隔符)。默认是 (", ", ": ")(逗号和冒号后面各有一个空格),改成 (",", ":") 就把空格全去掉了。

输出:

====默认展示====
{"user_id": 123, "name": "zhangsan"}
====紧凑格式====
{"user_id":123,"name":"zhangsan"}

​ 这个参数日常用得不多,但在需要精确控制输出格式的场景很关键。比如 JWT 的 Payload 编码就用紧凑格式,多一个空格,Base64 编码结果就不一样,签名就对不上。

4.4 参数可以组合

​ 这三个参数互不冲突,可以一起用:

data = {"姓名": "张三", "年龄": 28}

print(json.dumps(data, indent=2, ensure_ascii=False))
{
  "姓名": "张三",
  "年龄": 28
}

​ 不过 indent 和 separators=(",", ":") 一般不同时用,加了缩进就是为了好看,再去空格就矛盾了。

五、类型映射:Python 和 JSON 不是一一对应的

​ 这是用 json 模块最容易踩坑的地方。序列化和反序列化时,Python 类型和 JSON 类型之间有一张固定的映射表:

Python 类型→ JSON 类型→ 读回来的 Python 类型
dictobject {}dict
listarray []list
tuplearray []list ← 回不去了
strstringstr
intnumberint
floatnumberfloat
True / Falsetrue / falseTrue / False
NonenullNone

​ 大部分能完美往返,但注意有两个坑。

5.1 坑一:tuple 转出去就回不来了

​ JSON 里没有 tuple 这个概念,只有 array。所以 tuple 序列化后和 list 长得一样,读回来自然也是 list。如果你的代码依赖 tuple 的不可变性,来回转换后会出问题。

  • tuple类型:

    data = {"coords": (10, 20)}
    text = json.dumps(data)
    print(text)
    
    {"coords": [10, 20]}
    
  • 从JSON读回:

    loaded = json.loads(text)
    print(type(loaded["coords"]))
    
    <class 'list'>
    

5.2 坑二:整数键会被悄悄转成字符串

​ JSON 规范要求键必须是字符串,所以 dumps 会自动把整数键转成字符串。但 loads 读回来不会帮你转回整数,它只按 JSON 规范来,键就是字符串。

import json

data = {1: "one", 2: "two"}
text = json.dumps(data)
print("=====dict to json=====")
print(text)
====dict to json====
{"coords": [10, 20]}

​ 如果你的字典用整数做键,来回转换后会对不上。

loaded = json.loads(text)
print("====json to dict=====")
print(loaded[1])
====json to dict=====
Traceback (most recent call last):
  File "/02_JSON用法Python篇/code/scripts/integer_demo.py", line 11, in <module>
    print(loaded[1])
KeyError: 1

5.3 不在表里的类型:直接报错

​ datetime、set、bytes、自定义对象都不在映射表里,dumps 遇到它们就直接抛 TypeError。

from datetime import datetime

json.dumps({"time": datetime.now()})
# TypeError: Object of type datetime is not JSON serializable
(1) 手动转格式

​ 最简单的办法是手动转:

from datetime import datetime, timezone

data = {
    "event": "login",
    "time": datetime.now(timezone.utc).isoformat(),  # datetime → 字符串
    "tags": list({1, 2, 3}),                          # set → list
}
print(json.dumps(data))
{"event": "login", "time": "2026-03-26T03:50:03.946895+00:00", "tags": [1, 2, 3]}

​ datetime 转成 ISO 格式字符串是业界惯例,前端拿到后可以直接 new Date() 解析。

(2) 使用default指定处理方法

​ 如果项目里到处都有 datetime,每次手动转太烦,可以用 default 参数写一个统一的转换函数:

def json_default(obj):
    """json.dumps 遇到不认识的类型时会调用这个函数"""
    if isinstance(obj, datetime):
        return obj.isoformat()
    if isinstance(obj, set):
        return list(obj)
    raise TypeError(f"Object of type {type(obj).__name__} is not JSON serializable")

​ default 参数接受一个函数:每当 dumps 遇到映射表里没有的类型,就把那个对象丢给这个函数,函数返回什么 JSON 里就写什么。写一次,到处复用。

data = {"time": datetime.now(timezone.utc), "tags": {1, 2, 3}}
print(json.dumps(data, default=json_default))

输出:

{"time": "2026-03-26T03:53:23.265227+00:00", "tags": [1, 2, 3]}

六、错误处理:两种常见异常

​ 用 json 模块基本只会遇到以下两种错误。

6.1 序列化失败:TypeError

​ 把不支持的类型丢给 dumps:

import json
from datetime import datetime

try:
    json.dumps({"time": datetime.now()})
except TypeError as e:
    print(e)  # Object of type datetime is not JSON serializable

​ 解决办法上面讲过了,手动转类型或用 default 参数。

6.2 反序列化失败:JSONDecodeError

​ 把不合法的 JSON 字符串丢给 loads:

try:
    json.loads("{'name': 'zhangsan'}")  # 单引号,不是合法 JSON
except json.JSONDecodeError as e:
    print(e)  # Expecting property name enclosed in double quotes
try:
    json.loads("")  # 空字符串
except json.JSONDecodeError as e:
    print(e)  # Expecting value

​ JSONDecodeError 的报错信息通常很明确,会告诉你第几行第几个字符出了问题。常见原因:单引号代替了双引号、尾逗号、缺少引号、字符串没转义。

七、总结

你想做的事用什么
字典 → JSON 字符串json.dumps(data)
JSON 字符串 → 字典json.loads(text)
字典 → JSON 文件json.dump(data, f)
JSON 文件 → 字典json.load(f)
输出好看indent=2
中文不转义ensure_ascii=False
紧凑无空格separators=(",", ":")
datetime / set 报错手动转,或用 default 参数
解析报错捕获 json.JSONDecodeError

​ json 模块的本质就是 Python 对象和 JSON 文本之间的翻译器。四个核心函数、三个常用参数、一张类型映射表、两种异常。记住这些,单独用 json 模块就没有盲区了。

Python处理JSON文件数据各类操作一文详解+实例代码 前言 本文将详细描述如何利用python来处理JSON文件,将由浅入深从JSON文件格式介绍一步一步到python自带json库函数解析,整合上述操作再实现python脚本处理JSON文件。 一、JSON介绍 JSON(JavaScriptObject Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于ECMAScript(欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语... 阅读详情

相关推荐

【JS】自定义上传组件,文件上传与回显,自定义进度条显示(基于element-plus与axios)

公司是做B 端产品的,有sass平台也有源码交付的项目,最近开发了很多小系统,这里记录一下开发遇到的问题。 需要定制一个上传组件,要求可以自定义文件存储路径,自定义可上传的文件类型,限制文件大小等,并且提供基础的文件回显功能,例如上传一张图片到服务器指定目录的`/file`文件夹下面,并且实现可以查看预览的功能。

余浩的博客 1161

python字典与json转换_Python中字典和JSON互转操作实例

Python中字典和JSON互转操作实例

weixin_39679664的博客 177

VC Spyglass CDC实战:从TCL脚本到SDC约束的完整避坑指南

本文是一份针对数字IC验证工程师的VC Spyglass CDC实战指南。文章详细阐述了从TCL脚本环境搭建、SDC约束编写到典型CDC违规(如SETUP_PORT_UNCONSTRAINED)诊断与修复的完整流程,旨在帮助读者高效避坑,深入理解工具逻辑,从而完成可靠的时钟域交叉验证。

go5gopher的博客 382

python中json的使用

json模块 JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。Python 中可以使用 json 模块来对 JSON 数据进行编解码,它主要提供了四个方法: dumps、dump、loads、load json.loads:字符串(标准json格式)转换成 dict list: import json data = '[{"name":"张三","age":20},{"name":"李四","age":19},{"name":"小文","age":21}]

Jepson的博客 1235

Score Matching(得分匹配)

Score Matching(得分匹配)是一种统计学习方法,用于估计概率密度函数的梯度(即得分函数),而无需知道密度函数的归一化常数。这种方法由Hyvärinen在2005年提出,主要用于无监督学习,特别是在密度估计和生成模型中。

weixin_39699362的博客 2167

【实战解析】Ubuntu双网卡冲突:如何解决同一网段下网关无法访问及上网问题

本文深入解析Ubuntu服务器双网卡配置在同一网段时引发的路由冲突问题,导致网关无法ping通及无法上网。通过分析路由表与Metric值原理,提供使用route命令调整优先级及修改Netplan配置文件的实战解决方案,确保主次路由明确,一劳永逸解决网络冲突。

f9g0h的博客 280

python读写json和txt

读写json #数据保存如json文件 import json jsObj = json.dumps(code_sec) fileObject = open('jsonFile.json', 'w') fileObject.write(jsObj) fileObject.close() #读取json文件 # 将类文件对象中的JSON字符串直接转换成 Python 字典 with open('jsonFile.json', 'r', encoding='utf-8') as f:

qq_26742269的博客 512

避坑指南:RK3568双网口RMII模式DTS配置常见错误与调试技巧

本文详细解析了RK3568双网口RMII模式DTS配置中的常见错误与调试技巧,涵盖时钟配置、PHY识别、复位时序等关键问题。通过实战案例和系统化调试方法,帮助开发者快速解决百兆以太网连接不稳定、PHY识别失败等典型问题,提升开发效率。

weixin_42549037的博客 343

python遍历json_Python遍历文件夹 处理json文件的方法

有两种做法:os.walk()、pathlib库,个人感觉pathlib库的path.glob用来匹配文件比较简单。下面是第二种做法的实例(第一种做法百度有很多文章):from pathlib import Pathimport jsonanalysis_root_dir = "D:\\analysis_data\json_file"store_result="D:\\analysis_data\...

weixin_39685392的博客 271

OmniQuant:全方位校准实现大语言模型高效量化与移动端部署

模型量化是一种通过降低模型权重和激活值的数值精度来压缩模型大小、减少内存占用和计算开销的核心技术。其原理在于将高精度浮点数映射到低精度整数表示,从而在保持模型性能的同时,显著提升存储和计算效率。这项技术的价值在于,它使得大规模语言模型能够在消费级硬件和资源受限的移动设备上运行,极大地拓宽了AI应用场景。OmniQuant作为一项前沿的量化技术,通过引入可学习权重裁剪和可学习等价变换机制,实现了对权重分布不均匀和激活值异常值问题的协同优化,从而在极低的比特数下仍能保持优异的模型性能。本文深入探讨了OmniQu

weixin_30719711的博客 484

SecOC专题之新鲜值TripCnt

本系列为一步步拆解新鲜值的分发及管理而撰写文章属于原创,根据自身开发经验及理解撰写,若有错误请指出Trip Counter是新鲜值中变化最慢的一个part,并且自增到最大值时,会从头开始翻转计数。Trip Counter需要收发双方都保存,由于其变化较慢,所以不会经常进行同步该值。这就要求开发过程中保证每次对该值的读写必须要正确。

qq_22969363的博客 1154

python 中的 json.dumps() 与 json.loads()

python的json模块中提供了一种很简单的方式来编码和解码JSON数据,其中两个主要的函数是json.dumps()和json.loads()。json.dumps()将Python中纯粹的字典转换成JSON编码的字符串。json.loads():与dumps方法相反,将JSON编码的字符串转换成python中纯粹的字典。JSON格式文件、Python中的字典、JSON编码的字符串又是什么样子呢?下面是三种数据类的举例: JSON格式文件:{“phone”: “13011110000”, “type”:

王大傻的博客 1185

uniapp - 如何跟内嵌 web-view 组件内的网页交互,与 web-view 内嵌网页进行双向通信(uniapp 与 webview 网页之间的 “相互“ 传值)提供详细的示例代码及解决方案

uni-app如何实现在H5环境中与web-view中的网页交互通讯uniappuni-app 与 web-view内嵌网页 双向通信 如何跟内嵌web-view交互uniappAPP与webview子页面交互uniappAPP与webview子页面交互关于uni-app 使用 web-view 页面之间互相跳转、通信等问题uniapp的web-view嵌入网页,网页与uniapp通信webview如何与uniapp写的H5页面交互嵌套webview调用uniapp各种API组件实现H5和app通讯和交互

✅ 精选推荐文章 1万+

python-Json文件

python-文件操作(JSON)

Kiraxqc的博客 526

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

python实现json文件修改

对一个文件夹中的json文件中的key进行统一,代码如下: import json import os def process_json(input_json_file, output_json_file): file_in = open(input_json_file, "r") file_out = open(output_json_file, "w") # load数...

weixin_43971203的博客 1113

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

python解析json_读取本地json文件,解析json(实例讲解)

模拟用户登录# data.json 文件同目录下[{"id": 1,"username": "zhangshan","password": "123qwe","lock": false},{"id": 2,"username": "lisi","password": "123qwe","lock": false},{"id": 3,"username": "wangwu","password": ...

weixin_39942488的博客 824

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

python3的json的读和写

写: import json d = { 'wo': 'niuche', 'woniu': 'che' } with open("./example.json","w") as f: json.dump(d, f) 读: with open("./example.json") as f: json_data = json.load(f) print(json_data)

qq_35037684的博客 266

python解析json文件三种_python解析jSON文件

一、jSON文件http://baike.baidu.com/link?url=wYeeLnhpXX-Tt8AoBRSNPh2P7Z2YHyK2tdD1tbBOQMfJIpA-YNHMOg2ZN6aNoxCn-CjPMPLdG6ZZqzTJonUZk_二、Python1. 学习http://www.crifan.com/files/doc/docbook/python_beginner_tutor...

weixin_39831039的博客 90

【python实操】python小程序之文件操作的JSON读取和JSON修改

python小程序之文件操作的JSON读取和JSON修改

ya的博客 2259

Python 操作 json 数据

在Python中,操作JSON数据主要包括序列化(将Python对象转换为JSON格式)和反序列化(将JSON字符串转换回Python对象)。以下是使用Python内置的json模块进行这些操作的基本示例:JSON 序列化 (Serialization)JSON 反序列化 (Deserialization)JSON仅支持特定的数据类型,如数字、字符串、布尔值、null、数组(对应Python中的列表)和对象(对应Python中的字典)。

NHB66666666的博客 1213

python学习:常用的 json 操作

你一定听说过 JSON 吧。JSON 是当前最常用的数据传输格式之一,纯文本,容易使用,方便阅读,最重要的是在多个场合都被大量被使用。

Python热爱者的博客 6601

JSON及Python操作JSON相关

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。尽管 JSON 源于 JavaScript,它与编程语言无关,目前被广泛应用于各种编程语言中。函数描述参数返回值用途load从文件读取JSON数据,并转换为Python对象- file object: 包含JSON数据的文件对象Python对象从文件中读取并解析JSON数据loads从字符串读取JSON数据,并转换为Python对象。

lldhsds的专栏 1497

python json操作_python json操作

jsonJSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写。json是我们在制作爬虫时非常常见的网络对象,本文就列举python对于json的基本操作。json函数使用json函数首先要导入 json 库 即 import json主要使用以下两个函数:json.dumps  将 Python 对象编码成 JSON 字符串json.l...

weixin_39628186的博客 212

python json添加元素_Python 操作 json 数据

1. json 数据JSON(JavaScript Object Notation)` 是一种轻量级的数据交换格式,易于阅读和理解。JSON 格式可以对高纬数据进行表达和存储。JSON 格式通过键值对来表达信息,键是字符串,值可以是:值语法例如:{"name": "Felix","age": 18,"hobby": ["运动","妹子"],"friends": [{"name": "刘德华"},{...

weixin_39924198的博客 4111
上一篇: 【JSON小白篇】数据交换的通用语言—JSON
下一篇: 环境变量与密钥管理:别把密码写在代码里
未收敛
博客等级 码龄11年 3309粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未收敛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值