JSON Schema验证器实战:从选型到排错,打造稳定的数据校验体系
做后端接口也好做中台数据接入也好只要系统需要和别人交换 JSON 数据就一定绕不开一个问题这份数据到底符不符合约定我见过太多项目前期图省事把校验逻辑散落在业务代码里今天写一个 if明天补一个正则字段一多、版本一迭代校验就变成了一团乱麻。JSON Schema 就是专门用来解决这个问题的标准语言它用一份声明式的描述文件定义 JSON 数据的结构规则而 JSON Schema 验证器则是把这些规则真正执行起来的引擎——读入 Schema扫一遍数据告诉你哪里合格、哪里违规。这篇文章我会结合做 API 联调、数据接入时的真实经验把验证器怎么选、怎么用、怎么调优、怎么排错讲清楚。适合正在做接口设计、微服务开发、数据清洗的开发者也适合刚接触 Schema 概念、想系统入门的同学。1. 先搞清楚定位JSON Schema 验证器到底在解决什么问题1.1 为什么手写 if 校验这件事注定会翻车先看一个最普通的场景用户注册接口前端传一个 JSON 过来你需要在后端校验 username、email、age 这些字段。没有 Schema 时大家通常的做法是在处理函数开头写一串 ifif (!body.username || typeof body.username ! string) { throw new Error(username is required and must be a string); } if (body.age ! undefined (typeof body.age ! number || body.age 0 || body.age 150)) { throw new Error(age must be a number between 0 and 150); } // 还有 email、phone、address 的嵌套结构...两个接口还能忍二十个接口呢每个接口都要复制粘贴近似逻辑需求一变比如 age 上限改成 120你得把所有文件翻出来挨个改。而且这种散落的 if 判断经常会出现规则不一致A 接口允许 age 缺省B 接口却要求必填两边各自为政。这还只是入参校验如果还涉及出参、回调数据、配置文件手写逻辑的维护成本会指数级上升。JSON Schema 的方式完全不同。你把规则写成一份独立的 JSON 文档{ $schema: http://json-schema.org/draft-07/schema#, $id: https://api.example.com/schemas/user-register.json, type: object, properties: { username: { type: string, minLength: 2, maxLength: 30 }, email: { type: string, format: email }, age: { type: integer, minimum: 0, maximum: 150 } }, required: [username, email], additionalProperties: false }然后用任何语言里的验证器库一行代码完成校验。这份 Schema 可以同时用于后端入参校验、前端表单校验、接口文档生成、Mock 数据生成、自动化测试断言真正做到一次描述、处处复用。这就是 JSON Schema 的核心价值把数据长什么样从业务代码里抽离出来变成一种可共享、可版本化、可自动执行的契约。1.2 验证器在整套体系里的位置很多人刚开始会把 JSON Schema 和验证器混在一起说其实它们是两层东西。JSON Schema 是一套规范specification定义有哪些关键字、每个关键字怎么解释、不同关键字组合时语义是什么。目前主流版本是 draft-07、2019-09 和 2020-12不同版本之间关键字行为有差异选验证器时第一件事就是看它支持哪个 draft。验证器validator则是规范的具体实现是一个接收 Schema 数据、输出校验结果的程序库。它负责解析 Schema、理解关键字语义、遍历数据并报告违规。常见的验证器有 JavaScript 生态里的 Ajv、Python 里的 jsonschema、Go 里的 gojsonschema、Java 里的 networknt/json-schema-validator 等等。一句话总结Schema 是规则验证器是执行规则的人。脱离验证器Schema 只是一份静态文本有了验证器Schema 才变成工程的约束工具。理解这层关系之后后面所有的选型、调优、排错都有了出发点。2. 验证器核心工作原理关键字、编译与错误收集2.1 核心关键字逐个拆解要读懂验证器的行为先得知道 Schema 关键字是怎么影响校验结果的。我按日常使用频率排了个优先级把最重要的一批列出来关键字作用对象说明常见误用type任意值限定数据类型string/number/integer/object/array/boolean/nullinteger 不接受 1.0JSON 里 1.0 是 numberpropertiesobject按字段名校验子属性只检查出现过的字段不限制未声明字段requiredobject声明必填字段值为字段名数组忘了数组里是字符串而非对象additionalPropertiesobject是否允许未在 properties 里定义的字段设为 false 后嵌套对象也要注意itemsarray数组元素的校验规则与 2020-12 的prefixItems有差异enum/const任意值枚举白名单 / 精确相等const 用的是严格相等语义minimum/maximumnumber/integer数值边界与 exclusiveMinimum 组合关系minLength/maxLengthstring字符串长度按 Unicode 码点中文字符计数和预期不一致patternstring正则匹配正则默认不是完全匹配需要^...$formatstring语义格式email、uri、date、uuid 等很多验证器默认不启用 format 校验oneOf/anyOf/allOf子 Schema逻辑组合oneOf 要求恰好一个匹配常因两个子规则同时命中而报错$ref任意引用其他 Schema 片段循环引用会导致递归问题这里特别提两个容易踩坑的点。第一个是type: integer在 JSON 里1和1.0是两个不同的 number 值1.0不是 integer很多新手拿整数校验时被这个细节卡住。第二个是pattern默认不是全文匹配正则abc会匹配xxabcxx所以业务上如果要精确匹配一定要写^abc$。2.2 校验器的三步执行流程别看验证器 API 都是一行调用内部其实分了三步。第一步是解析。验证器读入 Schema JSON把它变成内部数据结构同时检查 Schema 本身是否合法——这也是验证器的隐藏功能它可以校验你的 Schema 是否是一个合法的 Schema专业说法叫 meta-schema 校验。很多Schema 写错了但校验一直没生效的诡异问题本质上是 Schema 本身就没过 meta 校验被验证器悄悄忽略了。第二步是编译。以 Ajv 为例它会把 Schema 编译成一段可执行的 JavaScript 函数代码生成技术这个函数接收数据对象内部逐个关键字检查返回校验结果。编译模式的好处是性能极高因为规则被转化成了接近手写的原生代码运行时不再需要一层层解释关键字。Python 的 jsonschema 默认走解释执行逐个关键字遍历性能相对差一些但胜在实现简洁、跨语言行为一致。第三步是执行与错误收集。校验器遍历数据匹配关键字把违规的地方转换成结构化的错误对象。一个成熟的验证器会同时报告多个错误而不是碰到第一个错误就停止这样调用方可以一次性拿到所有问题。Ajv 默认的allErrors选项也正是为了这个——打开后它会尽量报告全部错误而不是单个错误。2.3 编译与复用性能差异的根源用验证器最容易忽略的是编译一次校验多次这个原则。编译是开销最大的环节如果每次校验都重新编译同一份 Schema等于把宝贵的性能浪费在重复解析上。Ajv 的典型高性能写法是const Ajv require(ajv); const ajv new Ajv({ allErrors: true }); // 启动时编译一次缓存起来 const validate ajv.compile(userRegisterSchema); // 请求处理时只执行校验函数 function handleRegister(body) { const valid validate(body); if (!valid) { console.log(validate.errors); return 400; } // 业务逻辑... }我实测过一组数字一份包含 30 个字段、若干嵌套对象的业务 Schema用 Ajv 编译大约需要 2-5 毫秒但编译后的校验函数处理一份数据只要几十微秒。如果每个请求都重新编译性能损耗接近百倍。这一点在网关层做统一校验时尤其重要——网关是所有流量的入口校验逻辑必须高效。把编译好的校验函数放进缓存、Schema 变更时才重新编译是这类场景的标准做法。理解了执行流程后面选型和调优就有了依据。选库时我会先看它的编译方式、draft 支持版本、错误信息丰富度再结合实际项目验证。3. 主流验证器选型Ajv、Python jsonschema 与其他生态3.1 为什么 Node 生态里我首推 Ajv先说 Node.js。Ajv 是目前使用最广、性能最好的 JSON Schema 验证器npm 周下载量常年排在最前列几乎成了 Node 生态的默认选择Express、Fastify 的很多校验中间件底层就是它。Ajv 让我长期用下来的理由是这么几点性能优势明显编译型验证器官方 benchmark 长期领先支持多版本 draft默认是 draft-07可以配置成 2019-09 或 2020-12错误信息结构化每个错误包含instancePath、schemaPath、keyword、message、params方便前端友好展示支持自定义关键字和扩展我经常用它封装业务特有的校验规则比如手机号段白名单身份证号格式标准关键字表达不了的规则自定义关键字就能直接写进 Schema。Ajv 的用法前面已经写了编译缓存的代码。补充一个多 Schema 管理的场景一个服务通常有几十个接口、几十份 Schema我会把每份 Schema 按$id注册到同一个 Ajv 实例里然后用$ref引用避免重复定义公共片段。比如有个公共的pagination.json每个列表接口的 Schema 都$ref它改分页规则时只改一处所有接口同步生效。3.2 Python 生态jsonschema 库的用法与局限Python 里最常见的库是jsonschema由公共数字服务团队开源维护行为规范、文档清晰。基本用法import jsonschema from jsonschema import validate, ValidationError schema { type: object, properties: { name: {type: string, minLength: 1}, age: {type: integer, minimum: 0} }, required: [name] } try: validate(instance{name: Alice, age: 18}, schemaschema) print(valid) except ValidationError as e: print(e.message)这个库的问题也很明显性能一般。默认实现是解释执行数据量大时会成为瓶颈。如果要在 Python 里做高性能校验有几个思路一是把 Schema 校验放在数据量小的环节比如接口入口处避免在循环里反复校验大对象二是用jsonschema的validators.validator_for(schema)获取对应版本的验证器类定制自己的验证器只保留需要的类型检查器三是换用生成代码的 C 扩展实现比如fastjsonschema它把 Schema 编译成 Python 代码而不是解释执行性能能提升几十倍。另外提醒一句jsonschema库通过RefResolver处理$ref使用时注意设置base_uri否则相对引用容易解析失败。特别是当你从数据库或配置中心读取 Schema 时$id和实际存储位置不一致会非常隐蔽地导致引用找不到目标。3.3 其他语言与场景的选型参考Go 生态有gojsonschema、santhosh-tekuri/jsonschemaJava 生态有networknt/json-schema-validator、everit-org/json-schemaRuby 有json-schemagem。选择标准我总结成四问它支持你用的 draft 版本吗如果团队已经用 2020-12 的新特性比如prefixItems、unevaluatedProperties老库可能直接不支持它在你的运行环境下性能可接受吗网关、代理这类高频路径优先选编译型实现错误信息够不够细我最看重instancePath它能让调用方精确知道哪个字段出了问题而不是只给一句笼统文案社区活跃度如何校验器会跟着规范走一个长期不更新的库遇到新 draft 或安全修复会很被动。补充一个场景如果你的项目是前后端同构都是 TypeScript可以更进一步把同一份 Schema 用在运行时校验和类型生成上。这里有个工具叫 json-schema-to-typescript能把 Schema 转成 TS 接口再配合 Ajv 做运行时校验相当于一份 Schema 同时承担类型定义和运行约束两边永远不会不一致。我在做内部中台时就是这么干的接口改动时 Schema 一改类型和校验同步生效少了很多扯皮。4. 从零搭一个带 JSON Schema 验证的接口校验链路4.1 先定业务 Schema以用户注册接口为例我拿一个用户注册接口当例子把完整流程走一遍。需求是这样的注册时前端提交username、email、password、profileusername2-30 个字符只允许字母数字下划线email必须是合法邮箱password8-64 位至少包含字母和数字profile是可选对象里面nickname最长 50 字avatarUrl要是合法 URLtags是字符串数组每项最多 20 字。对应 Schema 我这样设计{ $schema: http://json-schema.org/draft-07/schema#, $id: https://api.example.com/schemas/user-register.json, type: object, additionalProperties: false, required: [username, email, password], properties: { username: { type: string, pattern: ^[a-zA-Z0-9_]{2,30}$ }, email: { type: string, format: email }, password: { type: string, minLength: 8, maxLength: 64, pattern: ^(?.*[A-Za-z])(?.*\\d).$ }, profile: { type: object, additionalProperties: false, properties: { nickname: { type: string, maxLength: 50 }, avatarUrl: { type: string, format: uri }, tags: { type: array, maxItems: 20, items: { type: string, maxLength: 20 } } } } } }几个设计决策说明一下。additionalProperties我两个层级都设成了false因为注册接口的入参是严格契约前端多传了字段说明有 bug或者有人在偷偷塞额外数据。这里要提醒的是把additionalProperties设为false会连带约束properties里没写到的所有字段所以每加一个新字段都要记得同步更新 Schema否则会被误伤。4.2 接入验证器的完整代码Node.js 端我演示原生 Ajv 的写法不依赖框架封装方便你看清原理const Ajv require(ajv); const addFormats require(ajv-formats); const userRegisterSchema require(./schemas/user-register.json); const ajv new Ajv({ allErrors: true, strict: false }); addFormats(ajv); const validate ajv.compile(userRegisterSchema); module.exports function validateRegister(body) { const ok validate(body); if (ok) { return { valid: true }; } const errors validate.errors.map((err) ({ field: err.instancePath.replace(/^\//, ), message: err.message, keyword: err.keyword })); return { valid: false, errors }; };ajv-formats这个插件要单独装因为从 Ajv v8 开始format关键字默认不启用。不启用的话email: { format: email }不会报错这是初用者最容易困惑的点——明明写了 format非法邮箱却通过了校验。错误信息映射这段很关键。instancePath默认是/username这种类似 JSON Pointer 的路径我把它去掉前导斜杠前端拿到field: username就能直接在对应输入框下提示错误。如果字段嵌套比如profile.tags[1]路径会是/profile/tags/1我习惯再做一层层级转换把数组下标替换成实际含义。Python 端做数据接入校验时也可以参考写法更简洁from fastjsonschema import compile as compile_schema # 启动时编译一次 validate compile_schema(user_register_schema) def check(body: dict): try: validate(body) return True, None except Exception as e: return False, str(e)4.3 校验失败后把错误变成人话机器校验完成了剩下一个更现实的问题怎么把错误信息变成用户能看懂的人话我刚才在代码里只做了简单映射实际项目里我通常再套一层文案模板把 keyword 转成对应的提示语。列一个常用的对照表keyword默认文案模板required请填写{字段名}type{字段名}类型不正确应为{期望类型}minLength/maxLength{字段名}长度需在{min}到{max}之间pattern{字段名}格式不正确format{字段名}格式不正确如邮箱、URLminimum/maximum{字段名}需在{min}到{max}之间oneOf{字段名}只能匹配以下规则中的一种additionalProperties不允许存在额外字段{字段名}这里的字段名不要直接拿 instancePath 里的名字最好维护一份字段的中文名映射比如username - 用户名。这样前后端提示语统一也避免英文下划线字段名直接暴露给用户。我见过很多项目卡在这一步校验器报错英文原样吐给用户体验很差其实加一个映射表就能解决。5. 真实项目里的踩坑记录与排查技巧5.1 高频问题速查表把这几年做 JSON Schema 验证踩过的坑整理成表遇到问题可以先按这个表排查现象根因解决format:email 不生效验证器默认不启用 format 关键字装 ajv-formats 或按需启用 format 类型合法数据反复报 requiredrequired里的字段名写错了或者 properties 中的字段不在 required 数组检查字段名拼写required 是字符串数组additionalProperties:false 导致误伤新字段忘了加入 Schema每个接口设计时先列全字段清单1.0 被当成 integer 校验失败JSON 里 1.0 是 number 类型用type: numbermultipleOf: 1表示整数pattern 匹配范围过大正则abc不是全匹配写成^abc$中文字符串 maxLength 数量不对部分语言按 Unicode 码点算长度组合字符更复杂业务上若按字符数限制需自定义长度校验循环$ref导致堆栈溢出A 引用 BB 又引用 A没有终止条件设计 Schema 时避免循环或用$ref指向具体属性而非整层oneOf 老是报错多个子 Schema 同时满足排查子 Schema 边界必要时改 anyOf 条件校验Schema 改了但校验结果不变验证器缓存了编译结果确认没有复用旧引用改成新 Schema 后再 compile相对$ref找不到目标没有设置 base URI用绝对$id或显式配置 resolver5.2 排错三步法最小化、二分、看原始错误我在帮别人排查 Schema 问题的过程中形成了固定的三步法分享出来。第一步是最小化。把出问题的 Schema 复制一份出来删掉所有不相关的字段只留能复现问题的最小集合。比如报错required缺失就只保留type: object、properties对应字段、required这一行。删完如果问题还在说明问题就在这三行里删完问题消失说明是某个被删配置和它互动的结果再逐步加回来找元凶。第二步是二分排查。如果 Schema 很长从中间砍成两半先测前半再测后半很快能锁定出错的片段。这个方法看起来笨但其实比肉眼盯 JSON 快得多尤其是嵌套对象多、关键字组合复杂的时候肉眼扫一遍根本看不出毛病。第三步是看原始错误对象。调试时不要只看err.message要把整个错误对象打印出来重点看schemaPath——它告诉你校验时命中的是 Schema 里的哪个位置经常一眼就能定位是哪个关键字在作祟。比如schemaPath: #/properties/password/pattern就说明问题出在 password 的 pattern 规则上再顺着去看正则就行。调试工具方面我常用 JSON Schema 官方的在线 playground粘贴 Schema 和测试数据可以实时看结果。跨语言项目还可以用 Ajv 的 CLI 或者写个临时脚本但我个人最推荐的还是最小化 Schema 打印完整错误简单可靠不依赖网络环境。5.3 Schema 管理版本、命名与协作规范最后聊一个不写代码但比代码更重要的点Schema 怎么管。项目大了以后Schema 文件数量会涨得很快没有规范就会乱。我的实践是三条约定。一是 Schema 文件统一放schemas/目录按域分子目录比如schemas/user/、schemas/order/文件名和$id的路径保持一致避免文件名是 user.json、$id 却叫 order这种错位。二是 Schema 必须带$id和$schema声明$id用稳定的、不会被文件位置影响的值。这样做最大的好处是可以安全地跨项目引用A 服务$refB 服务的 Schema 时只要$id稳定就无需关心 B 服务的部署细节。我把内部公共 Schema 发布到一个简单的 HTTP 地址配合$ref使用团队内部相当于有了一套数据结构标准件库。三是 Schema 变更走版本控制。客户端和服务端的契约是有时效性的直接在原 Schema 上改字段类型或必填项很可能让线上老客户端瞬间全部校验失败。我的做法是新增字段用 optional删字段先废弃再下线破坏性变更必须 bump 主版本号并在$id里体现。这套节奏看起来保守但经历过几次凌晨线上炸掉之后你就会明白安全的 Schema 演进比新功能上线重要得多。这几年的体感是JSON Schema 验证器不是一个装个库调个 API 就完事的工具它更接近一种团队协作和数据治理的思维方式。校验规则从 if 判断里抽出来之后代码变干净只是表面收益更大的收益是数据契约变得可以被 review、被测试、被版本化。如果让我给刚接触这套东西的朋友一个建议我会说不要一上来就追求把所有关键字用满先把type、properties、required、additionalProperties用好跑通一条最简单的链路再根据真实遇到的 bug 慢慢加复杂度。再顺手把错误信息做成人话版本把编译缓存和 Schema 版本管理跟上这套体系基本就能在团队里立住了。最怕的是写了大量复杂关键字组合出了问题连自己都解释不清每条规则在干什么那反而背离了用 Schema 省心的初衷。

相关新闻

Linux信号机制从产生到递送:进程异步通知与信号处理实战

Linux信号机制从产生到递送:进程异步通知与信号处理实战

1. 信号不是玄学:先搞懂它在Linux里的定位1.1 从硬件中断到软件信号的映射关系很多人在初学Linux编程时,对"信号"这个概念总有一种说不清道不明的感觉。程序跑着跑着被CtrlC干掉了,子进程退出时父进程收到一个SIGCHLD,段…

2026/10/9 3:08:56 阅读更多 →
Flutter for OpenHarmony实战:Visibility组件解析与最佳实践

Flutter for OpenHarmony实战:Visibility组件解析与最佳实践

去年我把一个原本跑在 Android 上的 Flutter 应用迁移到 OpenHarmony 开发板上,最让我意外的不是插件兼容清单有多长,而是一个被大多数人当成“if/else 语法糖”的组件——Visibility。当时前端同事看我代码时问了一句:“你这块为啥包个 Visi…

2026/10/9 3:08:56 阅读更多 →
.NET6 WebApi 用户鉴权实战:JWT 登录与令牌校验完整链路

.NET6 WebApi 用户鉴权实战:JWT 登录与令牌校验完整链路

简介:这是一份基于.NET6平台构建WebApi并集成JWT用户鉴权与Swagger测试的完整示例源码,面向正在学习C# WebApi开发、需要落地前后端分离鉴权流程的中级开发者。资源将用户登录、令牌生成与验证、接口授权及Swagger联调整合在同一个解决方案中&#xff0c…

2026/10/9 3:08:56 阅读更多 →

最新新闻

HermesWorkspace Playground 可选 3D NPC 模型替换指南:基于 GLB 的 Voxel 身体升级方案

HermesWorkspace Playground 可选 3D NPC 模型替换指南:基于 GLB 的 Voxel 身体升级方案

【免费下载链接】hermes-workspace Native web workspace for Hermes Agent — chat, terminal, memory, skills, inspector. 项目地址: https://gitcode.com/gh_mirrors/he/hermes-workspace 点击查看 免费下载 本文依据仓库 public/avatars-3d/README.md 编写&am…

2026/10/9 4:47:02 阅读更多 →
C++实现逆波兰表达式的例题详解

C++实现逆波兰表达式的例题详解

1. 题目描述2. 解题思路逆波兰表达式由波兰的逻辑学家卢卡西维兹提出,它的特点是:没有括号,运算符总是放在和它相关的操作数之后。因此,逆波兰表达式也称后缀表达式,它严格遵循「从左到右」的运算。在我们平时生活中&a…

2026/10/9 4:47:02 阅读更多 →
TaoToken 统一 Key 接入:Top 20 代码生成 LLM 在 Three.js 与 YOLO 工作流中的选型清单

TaoToken 统一 Key 接入:Top 20 代码生成 LLM 在 Three.js 与 YOLO 工作流中的选型清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 4:47:02 阅读更多 →
A股个人量化软件推荐:三款工具的仓位与交易规则

A股个人量化软件推荐:三款工具的仓位与交易规则

个人验证A股交易规则,可以比较BigQuant、牛股王股票和米筐在线量化平台。希望把筛选结果转成目标仓位并研究交易逻辑,了解BigQuant;希望配置持股数量、单票仓位及退出规则,检查牛股王股票中的智擎 AT 系统;希望用Pytho…

2026/10/9 4:47:02 阅读更多 →
Azure Cost Management Forecast API 请求体 Schema 完全指南:从字段解析到实战调用

Azure Cost Management Forecast API 请求体 Schema 完全指南:从字段解析到实战调用

【免费下载链接】autoskills One command. Your entire AI skill stack. Installed. 项目地址: https://gitcode.com/gh_mirrors/au/autoskills 点击查看 免费下载 导读 本文围绕 autoskills 仓库中 azure-cost 技能包(azure-cost)的 Forec…

2026/10/9 4:47:02 阅读更多 →
openrig 配置管理:统一 Claude Code 与 Codex 的 YAML 方案

openrig 配置管理:统一 Claude Code 与 Codex 的 YAML 方案

1. 从 openrig 说起:一个被名字耽误的配置管理思路第一次看到 openrig 这个词,很多人会以为是某个硬件外设品牌,或者某个开源机械臂项目。但如果你最近在折腾 Claude Code、Codex 这类命令行 AI 编程工具,又恰好被各种 YAML 配置、…

2026/10/9 4:46:02 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 13:34:55 阅读更多 →