前几天联调接口同事丢过来一段三百多行的日志 JSON我既要把它压缩成一行发给别人做对比又需要格式化之后逐字段核对。当时机器上没装其他编辑器打开在线工具又担心客户数据外传思来想去还是回到 Notepad把“JSON 压缩成一行”和“JSON 格式化”这两件事彻底捋清楚了。这篇就把我的完整操作写出来。适合所有日常要跟 JSON 打交道的开发者——不管是看接口返回、翻日志、改配置文件还是把别人发来的压缩 JSON 展开成可读结构文里的方案都能直接参考。先说总体结论想压缩成一行最快的是查找替换里的“换行清理法”想格式化最省心的是 JSON Viewer 插件想一劳永逸用 Python Script 写两段脚本绑定快捷键。下面每部分我都会把操作步骤和背后的原因讲清楚遇到坑也会单独说明。1. 为什么坚持在 Notepad 里处理 JSON而不是在线工具或 IDE1.1 一个联调场景里的真实需求那天的场景很典型第三方接口返回的 JSON 被日志系统截断了我复制出来之后缩进全乱、换行位置也很随意数组和对象一层套一层。我当时的任务是两件事把这段 JSON 压缩成一行发给同事做接口字段对比方便他直接在命令行里 diff再把同一段 JSON 格式化让我自己在编辑器里逐个字段核对返回结构。遇到这种需求很多人第一反应是打开网页版 JSON 工具。但问题在于那份数据里带了客户的部分脱敏信息虽然不算高危我也不想为了图方便把它贴到第三方网站上。另外就是为了压缩成一行这种小事装一个完整的 IDE成本太高。最后我发现 Notepad 其实完全够用它打开快、支持正则、有插件生态还能把重复操作录制成宏或者脚本。这套组合拳应付日常工作里的 JSON 处理已经绰绰有余。1.2 Notepad 处理 JSON 的边界能力先说清楚它能做什么、不能做什么。Notepad 不是 IDE不会给你字段补全也不懂 JSON 的语义。但是作为文本处理工具它有几个非常适合处理 JSON 的特长大文件打开速度快几十 MB 的日志也能顶住查找替换支持正则表达式能精准处理换行和空白插件体系成熟JSON Viewer、Python Script 这类插件可以直接解决解析和格式化问题宏录制功能可以把重复操作固化成快捷键。它做不到的事情也很明确比如自动修复不合法 JSON、理解某个字段的业务含义、或者在大文件里做流式处理。遇到这些需求就得换用专门的解析脚本或命令行工具。搞清楚边界才不会在错误的工具上浪费时间。1.3 三句话决定走哪条路线为了方便你判断我把常用方案列成了对照表。后面几章会分别展开讲每种方法的具体操作。方法压缩成一行格式化学习成本适合场景查找替换可用需技巧基本不行低临时处理、离线环境、简单结构JSON Viewer 插件一键完成一键完成低常规单次操作追求速度Python Script 脚本一键且零误伤一键且零误伤中高频操作、复杂内容、批量处理命令行工具稳定稳定中超大文件、批量处理简单来说应急用查找替换日常用插件高频用脚本超大文件别在编辑器里硬扛。2. 路线A查找替换的“换行清理法”做单行压缩2.1 直接删全部空白的坑字符串里的空格是业务数据如果你在网上搜“Notepad JSON 压缩”很可能会看到一种粗暴做法打开替换对话框勾选正则表达式查找目标写\s替换为空瞬间就把所有空白字符删光。看起来很快但这是个大坑。举个例子。有这样一段 JSON{ name: John Doe, description: hello world }如果直接执行\s替换为空你会得到{name:JohnDoe,description:helloworld}注意看John Doe变成了JohnDoehello world变成了helloworld。字符串值里的空格被吃掉了那份数据等于已经被你改了。原因很简单\s这个正则匹配的是所有空白字符——包括换行、制表符、普通空格而 JSON 字符串值内部的空格是有业务含义的不能一删了之。所以我的建议是先区分“压缩”和“清洗空白”。真正的压缩是在不改变字符串内容的前提下把结构排版产生的换行和缩进去掉。字符串值里的空格必须原样保留。2.2 安全的“换行清理法”先清行首尾再清真实换行既然不能无差别删空白那就只清理和排版相关的空白。我的做法分两步。第一步去掉每行行首和行尾的空白。在 Notepad 里按Ctrl H打开替换对话框勾选“正则表达式”查找目标填^[ \t]|[ \t]$替换为留空。注意这里我没用\s而是只匹配行首的行尾的空格和制表符。这样做不会碰到字符串内部的空格。第二步清真实换行。查找目标填\r?\n替换为留空。这一步会把 Windows 风格的\r\n和 Unix 风格的\n都去掉。为什么这个顺序安全因为合法 JSON 有个硬性规定字符串值内部的换行必须写成转义序列\n也就是反斜杠加字母 n 两个字符不允许出现真实的换行符。所以文件里出现的所有真实换行只可能是 JSON 结构上的换行删掉它们不会影响字符串内容。行首行尾的空白也是排版用的删掉同样安全。实际操作完的效果是这样输入{ name: John Doe, tags: [dev, json], note: hello world }输出{name:John Doe,tags:[dev,json],note:hello world}John Doe和hello world内部的空格原样保留整体已经变成了标准的一行 JSON。整个过程只需要两次替换而且每次替换的逻辑都能解释清楚。如果碰到的文件是老式 Mac 换行符\r第二步的查找目标可以改成\r\n|\r|\n三种换行风格都能覆盖适用于各种从邮件、网页里复制出来的脏文本。2.3 想在压缩时去掉冒号/逗号前后的空格该怎么做用“换行清理法”压缩之后结构空白基本清干净了但冒号、逗号、花括号周围可能还留有空格。比如这样{ name : John Doe, tags : [ dev, json ] }如果你要求压缩到最极端的紧凑形式也就是{name:John Doe}这种没有多余空格的样子可以再做一次清理。查找目标填[ \t]*([,{}:])([ \t]*)替换为\1原理是把逗号、冒号、花括号两侧可能存在的空格或制表符全部吞掉只保留符号本身。咔哒一下所有标点就贴紧了。这里必须提醒一句这个替换会同时清理字符串内部的冒号和逗号周围空格。假设数据里有一个字符串值是time: 12 : 30压缩后会变成time:12:30内容就变了。所以这一步只适合在确认字符串值里没有类似情况之后再用。求稳妥的话后面我会讲用脚本实现真正的零误伤压缩那才是没有副作用的方案。2.4 为什么正则方案没法真正“格式化”有人可能会问既然正则能做压缩能不能反着用把一行 JSON 替换成多行缩进格式答案是基本不行。原因在于格式化需要知道当前处于第几层嵌套才能决定这一行前面加多少缩进。正则表达式是没有状态记忆的它能匹配“{后面应该换行”但算不出这一行到底该缩进两格还是八个空格。你可以用几次替换强行把{、}、,都换成换行结尾但那只会得到一堆没有缩进、层次不清的文本比原来的样子好不了多少。所以格式化这件事要么交给能解析 JSON 的插件或脚本要么手工处理。正则能解决的是“压缩”这种删东西的问题很难解决“补缩进”这种需要上下文的问题。3. 路线BJSON Viewer 插件格式化 压缩的一条龙操作3.1 插件安装Plugin Admin 里搜 JSON Viewer如果你不想记正则也不想每次开替换对话框直接上一个 JSON Viewer 插件是最省心的选择。新版 Notepad 都自带插件管理功能。打开菜单“插件” - “插件管理”英文版是 Plugins Admin切到 Available 列表搜索JSON Viewer找到后点 Install重启 Notepad 就能在“插件”菜单里看到它了。如果你的 Notepad 版本比较老菜单里没有插件管理那就只能手动安装去插件官网或插件仓库下载对应版本的 zip根据你的 Notepad 是 64 位还是 32 位把里面的 dll 文件放到 Notepad 安装目录下的plugins文件夹里。特别注意位数必须匹配放错位置会导致插件加载不出来。安装完成后不需要额外配置插件菜单下会出现 Format JSON、Compress JSON 等入口。只要内容能被解析操作就是点一下的事。3.2 Format JSON 与 Compress JSON 的实际效果用法很简单。打开包含 JSON 的文本全选或者把光标放在 JSON 内容中间菜单“插件” - “JSON Viewer” -Format JSON插件就会把内容解析之后重新排版默认是两个空格缩进结构非常清晰。Compress JSON则相反会把排版后的内容压回紧凑的单行。这两个操作可以来回切换先 Format 看懂结构需要发送或对比时再 Compress 压回一行。插件内部用的是真正的 JSON 解析器所以字符串里的空格、冒号、逗号都不会被误伤这是它比手工正则可靠的核心原因。有一点需要注意如果只选中了一段文本插件可能只处理选中部分没选中的内容保持原样。想处理整个文件的时候记得先全选或者确认光标处在 JSON 顶层。不同版本的行为细节略有差别但记住这个习惯就不会出错。部分版本的 JSON Viewer 还带树形浏览面板和节点路径显示可以在左侧按层级展开对象和数组点一个字段就能定位到它在文本中的位置。对于嵌套很深的 JSON这个功能比单纯看缩进文本更直观。3.3 大文件和特殊内容的实测边界JSON Viewer 虽然好用但不是万能的。我实测下来的感受是几 MB 的 JSON 随便处理毫无压力十几 MB 以上Format 的时候会明显卡顿到二三十 MB 的日志级别插件可能要卡好几秒甚至假死。原因不难理解插件需要把整段 JSON 读进内存、建树、再重新生成文本内存开销比单纯显示文本大得多。所以我的原则是小文件用插件大文件不硬扛。如果手头有几十万行的超大 JSON直接交给命令行里的 jq 或 Python 脚本处理Notepad 只负责打开看结果。你可以在终端里先处理好再在 Notepad 里查看输出文件一样顺手。另外如果 JSON 里包含特别深的嵌套结构树形面板可能会卡纯文本模式下反而稳定一些。我建议能用 Format JSON 看懂就不要轻易开树形面板开多了插件会把整个结构展开渲染反而拖慢编辑器。3.4 插件报错时的排查流程用插件最烦的情况是点了 Format JSON界面没反应或者弹出一个错误提示。大多数人第一反应是“插件坏了”但实际上绝大多数情况是 JSON 本身不合法。插件不是修复器它只会拒绝处理。常见的非法 JSON 情况我整理成了一个表现象常见原因处理方式字符串用单引号包裹从 Python 或 JS 代码里直接复制出来手动改成双引号数组或对象末尾多了逗号手写时留下的,删除最后一个逗号JSON 里出现//或/* */注释常见的配置文件写法但标准 JSON 不允许先去掉注释再格式化出现NaN、Infinity非标准数值JSON 里不允许替换成null或合法数值中文变成乱码或特殊符号编码不一致插件按错误编码解析先统一转成 UTF-8排查手法也有步骤可循。遇到插件不动作时我先把整段内容复制到一个新标签用第 2 章的“换行清理法”压缩成一行再从文本开头往后一小段一小段地检查看到底是哪里断了。Notepad 的括号匹配功能也能帮忙把光标放在一个{或[上看它有没有对应的闭合符号。如果配对不上多半那附近就有语法问题。4. 应急方案不装插件把压缩 JSON 手工展开成多行4.1 什么时候需要应急手段插件这么好用为什么还要研究手工方案因为实际工作里总有意外公司电脑权限受限装不了插件离线环境没法访问插件仓库又或者只是别人临时发来一小段压缩 JSON不想为一个操作折腾半天的安装流程。这时候纯靠 Notepad 自带功能也能展开一部分结构。先说明底线手工展开只能应付简单的中小型 JSON而且必须确认字符串内容里没有{、}、,这类符号。一旦存在手工替换就会误伤数据。这句话我会在下面反复强调因为它真的很重要。4.2 最朴素的换行替换{、}、, 分别处理假设你手里有一行压缩 JSON{name:John Doe,tags:[dev,json],note:hello world}目标是让它多行显示。打开替换对话框勾选正则表达式依次做三次替换查找\{替换为{\n让每个对象左花括号后面换行查找\}替换为\n}让每个右花括号独立成行查找,替换为,\n让每个逗号后面换行。这里有个实操细节不勾选正则时替换为输入框里的\n不一定被解释成换行符不同版本行为不一样。如果你发现替换后输出的是带字母 n 的文本就直接从原文本里复制一个真实换行符粘贴到“替换为”输入框中效果一样。我个人的习惯是干脆在找到合适匹配后先把换行符准备好再执行替换。做完之后文本会变成“每个括号和逗号各占一行”的松散结构。虽然没有缩进但至少字段被拆分开了肉眼定位字段位置已经容易很多。之后再按 4.3 的方法补缩进。4.3 缩进的快速恢复列块编辑与层级判断只有换行没有缩进的 JSON 还是不够好看。补缩进时Notepad 的列块编辑非常有用按住 Alt 键用鼠标纵向拖动选中若干行的开头位置按 Tab 键或 ShiftTab 可以批量增加或减少缩进。判断缩进层级的原则很简单遇到{或[开头的行里面内容的层级加一遇到}或]结尾的行这一行本身和其后的内容层级减一同一行里如果同时出现结束和开始符号比如},b:{需要拆开理解这种时候只能逐层处理。实际操作时我一般先把最外层的大括号拎出来然后从里往外一层层加缩进。字段少的时候很直观嵌套深了就会非常费眼睛。如果层级超过四五层我还是建议去装插件或写脚本手工会把人累垮。4.4 手工方案的底线先确认字符串里没有结构符号手工方案最大的风险就是误伤字符串。所以动手之前可以先做一次检查在查找对话框里启用正则查找[^]*然后逐个匹配看结果。如果匹配到的字符串内容里出现了{、}或,那就说明这份 JSON 不适合用手工换行替换至少不能直接全局替换。如果 JSON 字符串里含有转义引号\上面的[^]*会截断匹配。这种时候需要用更严谨的写法(?:[^\\]|\\.)*它匹配的是一段完整的双引号字符串包括内部的转义符号。匹配结果会帮你判断哪些{、}、,位于字符串内部从而提前避开。当然如果这类情况很多手工方案基本可以放弃了直接跳到下一章用脚本处理才是正道。5. 把高频操作固化宏 Python Script 一键压缩/格式化5.1 录制宏让两步替换变成一个快捷键如果你反复要用第 2 章的“换行清理法”把它录制成宏是最快的固化方式。操作步骤准备一段包含多处换行的 JSON 文本菜单“宏” - “开始录制”执行第 2 章的两个替换操作清除行首行尾空白、清除真实换行菜单“宏” - “停止录制”保存宏命名为“JSON单行”再通过“宏”菜单或快捷键设置给这个宏绑定一个快捷键。录制完成后以后任何 JSON 文本放到编辑器里按一下快捷键就能压缩成一行不需要再手动打开替换对话框。这里有一个我踩过的坑宏回放时如果某个替换操作找不到匹配项Notepad 会弹出类似“找不到相关字符串”的提示然后卡在那里等点确认。比如你已经把文本压缩成一行了再运行宏第二步“去掉换行”就会找不到匹配宏就会停下来。我的解决办法是运行宏之前先确认文本里还有换行如果已经是单行内容就先随手插入一个空行再运行宏。不同版本的弹框行为略有差异但提前确认匹配项这个习惯总能避免卡顿。5.2 Python Script用 json 库做零误伤的压缩与格式化宏解决了速度问题但没有解决“字符串内部空白被误伤”的问题。要说真正零误伤、任何复杂 JSON 都能安全压缩和格式化的方案还得靠 Python Script 插件里的json库。安装方法和 JSON Viewer 一样插件管理里搜索Python Script安装后重启。然后在菜单“插件” - “Python Script” - “New Script”里分别创建两个脚本。压缩脚本代码非常简单import json text editor.get_text() try: obj json.loads(text) new_text json.dumps(obj, separators(,, :), ensure_asciiFalse) editor.set_text(new_text) except ValueError as e: notepad.message_box(Invalid JSON: {}.format(e))格式化脚本import json text editor.get_text() try: obj json.loads(text) new_text json.dumps(obj, indent2, ensure_asciiFalse) editor.set_text(new_text) except ValueError as e: notepad.message_box(Invalid JSON: {}.format(e))运行方式菜单“插件” - “Python Script” - “Scripts”在列表里找到对应脚本双击即对当前文件生效。脚本会自动读取整个编辑器内容解析并重新输出。这两个脚本为什么稳妥因为json.loads会先把文本解析成对象语法不对直接报错提示不会动你的原文本json.dumps再重新序列化输出的字符串里的空格、逗号、冒号全部按字符串内容原样保留不存在正则误伤的问题。ensure_asciiFalse是关键参数保证中文不会被转义成\uXXXX那一堆编码压缩脚本里separators(,, :)把默认的分隔符从, 和: 缩成了,和:这就是“压缩成一行”的基本原理。如果你用格式化脚本跑一个原本就是压缩状态的 JSON效果等同于在文件上执行一次标准格式化如果再用压缩脚本跑回来又会回到紧凑模式。来回切换很自然。另外提醒一个容易忽略的坑如果 JSON 里存在重复键json.loads默认会让后面的值覆盖前面的值压缩或格式化之后重复键就“消失”了。调试时如果发现数据比原来看起来少了先怀疑是不是重复键的问题。5.3 不装插件也能调外部命令NppExec 与命令行工具Python Script 插件有时候因为权限问题装不上还有一个替代思路用 NppExec 插件或者干脆打开终端跑命令行。如果本机有 Python格式化用官方自带的json.tool模块即可python -m json.tool input.json output.json想压缩成一行可以用一行 Python 命令python -c import json; djson.load(open(data.json, encodingutf-8)); print(json.dumps(d, separators(,,:), ensure_asciiFalse)) data.min.json在 Windows 下的坑是控制台编码重定向输出时中文很可能被按 GBK 写回文件导致乱码。处理办法是先执行chcp 65001切换控制台编码或者设置环境变量set PYTHONIOENCODINGutf-8这个方案适合批量处理文件也适合超大文件。命令行工具对文件大小没有编辑器插件的卡顿问题跑完再用 Notepad 打开结果就是最舒服的组合。6. 实际翻车记录编码、BOM、非法换行与我的检查习惯6.1 中文乱码先检查编码再怀疑压缩遇到过很多次类似的求助“从 Notepad 格式化之后中文全部变成乱码了。”其实压缩和格式化动作本身不会产生乱码它们只是重排和清理空白不碰字符内容。乱码的根源几乎都是文件编码出了问题。Notepad 状态栏右下角会显示当前文件的编码信息。如果显示是 ANSI而文件内容里有中文插件或脚本按 UTF-8 解析时就会出现乱码。处理办法是在菜单“编码”里选择“转为 UTF-8 编码”把当前内容从 ANSI 转换成 UTF-8然后再做格式化或压缩。注意选的是“转为”不是“使用 UTF-8 编码”这两者含义完全不同。“转为”会保留当前字符并按新编码保存“使用”则只是切换解释方式可能导致内容显示混乱。养成习惯拿到一份含中文的 JSON第一件事先确认右下角编码再动手处理。这一步能省掉后面一大半的乱码问题。6.2 BOM 引发的坑保存成 UTF-8 无 BOM另一个很常见但不容易被发现的问题是 BOM。Windows 记事本保存的 UTF-8 文件默认会在文件开头加上三个不可见字符EF BB BF。Notepad 打开时通常能正常识别但你把这份 JSON 交给后端解析、或者丢给脚本处理时有些解析器会把 BOM 当成字符串的一部分导致解析失败。处理方法菜单“编码” - “转为 UTF-8 无 BOM”。只要这份 JSON 是要给程序用的一律存成“UTF-8 无 BOM”格式把 BOM 隐患直接掐死在源头。这个习惯在配置文件和接口数据文件上特别重要。6.3 字符串里的真实换行源数据不合法的信号有时候你会看到一段 JSON字符串值内部真的“换行”了看起来像是某种多行字符串。实际上标准 JSON 不允许这种写法。字符串值内的换行必须写成\n转义序列文件里出现的真实换行符如果位于字符串内部那么这段 JSON 从源头就是非法的。这个问题的危险之处在于用“换行清理法”压缩之后所有真实换行都被删掉了文本看起来变成了合法的一行 JSON但用json.loads解析时依然会报错因为字符串里的真实换行破坏了语法。如果你压缩完怎么都解析不过检查一下最初的原始数据里字符串内容中是否有真实换行。遇到这种情况得回源端修改数据把字符串内部的真实换行改成\n而不是继续在编辑器里反复试。6.4 我的检查习惯与组合工作流处理了这么多次 JSON我慢慢摸索出一套固定的检查流程。拿到一份 JSON 后我通常按这个顺序走复制到 Notepad 新标签先看右下角编码中文内容乱码就先转成 UTF-8用 JSON Viewer 的 Format JSON 试一下能不能解析解析失败就按第 3 章的排查流程修数据需要压缩时用 Python Script 的 compress.py或者 JSON Viewer 的 Compress JSON二选一压缩完再 Format 回来核对几个关键字段是否还在确认数据没丢需要发给别人做对比时我会用压缩脚本输出一版最短的单行 JSON并在工单里注明它是标准格式避免对方复制时带上多余换行。这套流程用了很久基本覆盖了绝大多数 JSON 处理场景。工具不在多关键是每个动作都要知道它在做什么。宏、脚本这些建议你现在就花十分钟配好不然真到日志铺过来的时候才手忙脚乱找工具那就晚了。
企业数字化 ERP 产品动态
相关推荐
Claude Code模板体系:从CLAUDE.md到自定义命令的工程实践 1. 为什么说 Claude Code 比“直接对话”更需要模板1.1 先搞清楚 Claude Code 的模板到底指什么Claude Code 是跑在终端里的 AI 编码助手,它和网页端对话式编程最大的区别,是它直接运行在你本地的项目目录里,能读文件、能跑命令、能改代码&am… · 2026/9/25 9:54:45
VSCode插件配置实战:语言环境、远程SSH与AI辅助一次讲透 简介:VSCode插件合集是一份面向开发者的常用插件资源包,旨在帮助用户快速搭建高效、个性化的编码环境。资源整合了Prettier、ESLint、GitLens、Path Intellisense等十余款热门插件,覆盖代码格式化、静态检查、Git操作、路径补全等场景&#x… · 2026/9/25 9:54:45
284B大模型本地跑!DeepSeek V4 Flash + TaoToken 部署配置与量化验证指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 9:54:20
从行为克隆到ACT:Ventuno Q机器人模仿学习部署实践 1. 为什么偏偏是ACT:从行为克隆到动作分块的进化1.1 行为克隆的瓶颈:平均动作陷阱第一次在Ventuno Q上尝试模仿学习时,我的第一反应其实是拿行为克隆(Behavior Cloning,BC)直接上。毕竟最朴素的做法&#x… · 2026/9/25 10:39:25
使用 AWS SDK for Java V2 与 AWS Step Functions 构建无服务器工单处理工作流 示例工程教程后端 【免费下载链接】aws-doc-sdk-examples Welcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below. 项目地… · 2026/9/25 10:39:19
开放式代码评审:从形式化到团队共识的工程实践 1. 从一次"走过场"评审说起:为什么我不再小看"Open Code Review"过去很长一段时间,我对自己团队里的代码评审(Code Review)抱着一种"做了总比不做好"的态度。每周固定两个下午,几个人拉… · 2026/9/25 10:39:13
moto DynamoDB Mock 功能覆盖解析:完整操作清单、实现限制与源码级验证 Mock测试 【免费下载链接】moto A library that allows you to easily mock out tests based on AWS infrastructure. 项目地址: https://gitcode.com/gh_mirrors/mo/moto 点击查看 免费下载 本文以 moto 仓库中的 DynamoDB 服务功能覆盖文档(docs/docs… · 2026/9/25 10:39:06
Flux Helm OCI 支持(RFC-0002):把 Helm Chart 存入容器镜像仓库的设计与落地 云原生CI/CD容器编排DevOps 【免费下载链接】flux2 Open and extensible continuous delivery solution for Kubernetes. Powered by GitOps Toolkit. 项目地址: https://gitcode.com/gh_mirrors/fl/flux2 点击查看 免费下载 本篇基于 Flux 官方设计文档 RFC-0002&… · 2026/9/25 10:39:00
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37