一、什么是 JSON?—— 最核心的概念
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,长得像键值对的集合,用途是存储和传递数据。在 VS Code 中,它常被用来写配置文件(比如调试配置、插件配置等),语法简单且易于阅读。
核心特点:
- 由「键值对」组成(类似字典:
"键": "值"
) - 键和字符串值必须用双引号(
""
)包裹(单引号会报错) - 用逗号(
,
)分隔多个键值对(最后一个键值对后不能加逗号) - 支持嵌套(对象里放对象 / 数组,数组里放对象 / 值)
二、JSON 的基本数据类型(必须掌握)
JSON 中值的类型有 5 种,在 VS Code 配置中最常用的是前 4 种
类型 | 示例 | 说明 |
---|---|---|
字符串 | "name": "mps3-r52" |
用双引号包裹的文本(路径、名称常用) |
数字 | "version": "0.2.0" |
整数或小数(注意:VS Code 配置中版本号常用字符串形式) |
布尔值 | "stopAtEntry": true |
只有 true (真)或 false (假) |
数组 | "args": [] |
用 [] 包裹的列表,可放多个值 |
对象 | "configurations": [{}] |
用 {} 包裹的键值对集合,可嵌套 |
三、VS Code 中 JSON 的典型应用:调试配置文件(launch.json)
提供的示例就是 VS Code 调试 C/C++ 程序的配置文件(launch.json
),用于告诉 VS Code 如何启动调试器。我们先通过这个示例拆解结构:
{
"version": "0.2.0", // 配置文件版本(VS Code 规定的固定值,无需修改)
"configurations": [ // 调试配置列表(数组,可放多个配置方案)
{ // 第一个配置方案(对象)
"name": "mps3-r52", // 配置名称(显示在调试面板,方便选择)
"type": "cppdbg", // 调试类型(C/C++ 程序用 "cppdbg")
"request": "launch", // 调试方式:"launch"=启动程序;"attach"=附加到已运行程序
"program": "${workspaceRoot}/bsp/qemu-mps3-an536/rtthread.elf", // 待调试的程序路径
"args": [], // 启动程序时的命令行参数(无参数则为空数组)
"stopAtEntry": true, // 启动后是否在程序入口(如 main 函数)暂停
"cwd": "${workspaceRoot}", // 调试时的工作目录(程序运行的根目录)
"environment": [], // 调试时的环境变量(无特殊需求则为空)
"externalConsole": true, // 是否使用外部控制台(而非 VS Code 内置终端)
"miDebuggerPath": "D:\\...\\arm-none-eabi-gdb.exe", // 调试器的安装路径
"miDebuggerServerAddress": "localhost:1234", // 调试服务器地址(远程调试用)
"serverLaunchTimeout": 2000, // 连接调试服务器的超时时间(毫秒)
"targetArchitecture": "ARM", // 目标程序的 CPU 架构(如 ARM、x86)
"MIMode": "gdb", // 调试器模式(GDB 调试用 "gdb")
"customLaunchSetupCommands": [], // 自定义调试命令(默认无需修改)
"launchCompleteCommand": "exec-run" // 配置完成后执行的命令("exec-run"=开始运行)
}
]
}
四、JSON 语法规则(避坑重点)
双引号必须成对:键和字符串值必须用双引号,单引号('
)或漏写会报错。
❌ 错误:'name': 'mps3-r52'
或 name: "mps3-r52"
✅ 正确:"name": "mps3-r52"
逗号不能多写:多个键值对之间用逗号分隔,但最后一个键值对后不能加逗号。
❌ 错误:
{
"name": "mps3-r52",
"type": "cppdbg", // 最后一个键值对后多了逗号
}
✅ 正确:
{
"name": "mps3-r52",
"type": "cppdbg"
}
对象和数组的嵌套:
- 对象用
{}
包裹,里面是键值对; - 数组用
[]
包裹,里面是值(可以是字符串、对象等); - 嵌套时注意层级对齐(VS Code 会自动格式化,按
Ctrl+Shift+I
可格式化)。
五、VS Code 中的 JSON 变量(${xxx})
在示例中出现的 ${workspaceRoot}
是 VS Code 预定义的变量,用于动态获取路径(避免写死绝对路径),常用变量:
变量 | 含义 |
---|---|
${workspaceRoot} |
当前打开的工作区根目录 |
${file} |
当前打开的文件路径 |
${fileDirname} |
当前打开文件的所在目录 |
例如:"program": "${workspaceRoot}/rtthread.elf"
会自动替换为工作区根目录下的 rtthread.elf
文件路径。
练习题(阶段 1:基础语法)
题目 1:判断以下 JSON 是否正确,若错误请修正
{
"name": 'debug',
"type": cppdbg,
"request": "launch"
}
题目 2:补全以下 JSON,要求:
添加 program
键,值为工作区根目录下的 build/main.elf
添加 stopAtEntry
键,值为 false
{
"version": "0.2.0",
"configurations": [
{
"name": "my-debug",
"type": "cppdbg",
"request": "launch",
// 在此处补全
}
]
}
练习题答案与解析
题目 1 解析:
❌ 原 JSON 错误,问题有两处:
name
的值用了单引号'debug'
,应改为双引号"debug"
;type
的值cppdbg
漏了双引号,应改为"cppdbg"
。
✅ 修正后:
{
"name": "debug",
"type": "cppdbg",
"request": "launch"
}
题目 2 解析:
需要添加两个键值对,注意格式和变量用法:
{
"version": "0.2.0",
"configurations": [
{
"name": "my-debug",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceRoot}/build/main.elf", // 补全program
"stopAtEntry": false // 补全stopAtEntry,注意无逗号(最后一个键值对)
}
]
}
六、进阶:理解调试配置的实际作用(结合工作场景)
以你的示例为例,每个字段在调试中的作用:
name
:在 VS Code 调试面板中显示的配置名称,方便切换不同配置;program
:指定要调试的程序(必须是带调试信息的可执行文件,如.elf
);miDebuggerPath
:指定调试器的路径(如arm-none-eabi-gdb.exe
是 ARM 架构的 GDB 调试器);miDebuggerServerAddress
:如果调试的是远程程序(如开发板),这里填远程服务器的地址(IP:端口
);stopAtEntry
:true
表示程序启动后会在main
函数入口处暂停,方便逐步调试。
{
"version": "0.2.0",
"configurations": [
{
"name": "stm32-debug", // 修改名称
"type": "cppdbg",
"request": "launch",
"program": "${workspaceRoot}/bsp/stm32f103/rtthread.elf", // 修改程序路径
"args": [],
"stopAtEntry": false, // 改为不暂停
"cwd": "${workspaceRoot}",
"environment": [],
"externalConsole": true,
"miDebuggerPath": "C:\\tools\\arm-gcc\\bin\\arm-none-eabi-gdb.exe", // 修改调试器路径
"miDebuggerServerAddress": "localhost:1234",
"serverLaunchTimeout": 2000,
"targetArchitecture": "ARM",
"MIMode": "gdb",
"customLaunchSetupCommands": [],
"launchCompleteCommand": "exec-run"
}
]
}
练习题(阶段 2:实际应用)
题目 3:修改示例配置,满足以下需求
- 配置名称改为
stm32-debug
; - 调试的程序路径为工作区
bsp/stm32f103/rtthread.elf
; - 调试器路径为
C:\tools\arm-gcc\bin\arm-none-eabi-gdb.exe
; - 启动后不在入口处暂停(即
stopAtEntry
为false
)。
题目 3 答案与解析:
按需求修改对应字段即可,注意路径中的反斜杠(\
)在 JSON 中无需转义(直接写 C:\tools\...
):
{
"version": "0.2.0",
"configurations": [
{
"name": "stm32-debug", // 修改名称
"type": "cppdbg",
"request": "launch",
"program": "${workspaceRoot}/bsp/stm32f103/rtthread.elf", // 修改程序路径
"args": [],
"stopAtEntry": false, // 改为不暂停
"cwd": "${workspaceRoot}",
"environment": [],
"externalConsole": true,
"miDebuggerPath": "C:\\tools\\arm-gcc\\bin\\arm-none-eabi-gdb.exe", // 修改调试器路径
"miDebuggerServerAddress": "localhost:1234",
"serverLaunchTimeout": 2000,
"targetArchitecture": "ARM",
"MIMode": "gdb",
"customLaunchSetupCommands": [],
"launchCompleteCommand": "exec-run"
}
]
}