Birdor JSON Formatter 实现规格:页面结构、状态机、错误类型与测试样例

定义 Birdor JSON Formatter 的产品实现规格,覆盖页面结构、交互状态机、错误类型、输入输出、测试样例、指标和后续 API 复用边界。

本系列导航

本章关键词

JSON Formatter、实现规格、页面结构、状态机、错误类型、测试样例、本地执行、工具页模板。

适合阅读的人

  • 准备实现 Birdor JSON Formatter 的工程师。
  • 需要把 PRD 转成可验收产品规格的人。
  • 想用 JSON Formatter 沉淀 Birdor 工具页标准的人。

本章摘要

JSON Formatter 是 Birdor 第一批基础工具中的样板工具。它的价值不只是格式化 JSON,而是验证工具页基础模式:本地执行、输入输出区域、操作按钮、错误提示、隐私说明、相关工具、FAQ、指标和后续 API 复用。

本文把 JSON Formatter PRD 和 首批工程 Issue 转成实现规格。实现时应优先保证正确性、稳定性和错误体验,AI schema 推断、批量处理、大文件 Worker 和 API 不进入第一版。

页面结构

JSON Formatter 页面建议分为六个区域:

区域内容要求
Header标题、描述、隐私提示说明本地处理,不上传输入
ToolbarFormat、Minify、Validate、Sample、Clear按钮有 disabled/loading/success 状态
Editor输入区、输出区、行号或基础高亮桌面双栏,移动端上下排列
Error Panel错误类型、行列、修复建议解析失败时显示,不清空输入
UtilityCopy、Download、Indent size操作完成有短反馈
ContentFAQ、相关工具、API 预留不干扰首屏任务

首屏必须能直接使用。SEO 内容和 FAQ 放在工具下方,不应把工具挤到折叠以下。

数据模型

页面状态建议包含:

字段类型说明
inputstring用户原始输入
outputstring格式化或压缩输出
modeformat/minify/validate当前操作模式
statusidle/dirty/success/error工具状态
errorobject/null解析错误信息
indentnumber缩进宽度,默认 2
lastActionstring/null最近一次操作,用于反馈

error 对象建议包含:

字段说明
typesyntax、empty、too_large、unknown
message面向用户的错误说明
line可选,错误行
column可选,错误列
suggestion可选,修复建议

状态机

状态流转建议如下:

当前状态触发下一个状态说明
idle用户输入dirty输入区出现内容
dirtyFormat 成功success输出格式化 JSON
dirtyMinify 成功success输出压缩 JSON
dirtyValidate 成功success展示 valid 状态
dirty解析失败error展示错误,不清空输入
successCopysuccess显示 copied 反馈
successClearidle清空输入输出
error用户修改输入dirty清除旧错误或标记待重试

关键原则:任何失败都不能清空原始输入。用户输入是资产,工具必须保护它。

操作规则

Format:

  • 输入为空时显示空输入提示。
  • 输入合法时使用缩进输出。
  • 输出区显示格式化结果。
  • 更新 lastAction 为 format。

Minify:

  • 输入合法时输出无多余空白的 JSON。
  • 不改变字符串内部内容。
  • 更新 lastAction 为 minify。

Validate:

  • 输入合法时展示 valid 状态。
  • 可输出格式化结果,也可只显示校验成功。
  • 第一版建议同时输出格式化结果,方便用户继续复制。

Sample:

  • 填入包含对象、数组、字符串、数字、布尔、null 的示例。
  • 示例应简短,不超过首屏太多。

Clear:

  • 清空 input、output、error。
  • 状态回到 idle。

Copy:

  • 优先复制 output。
  • 如果 output 为空但 input 有内容,不自动复制 input,避免误导。
  • 复制失败时显示浏览器权限提示。

Download:

  • 下载 output 为 .json。
  • output 为空时 disabled。

错误类型

第一版至少处理:

错误判断用户提示
empty输入为空或仅空白请粘贴 JSON 后再操作
syntaxJSON.parse 失败JSON 语法错误,请检查逗号、引号或括号
trailing_comma错误信息或简单规则命中JSON 不支持尾随逗号
unclosed_string错误信息命中字符串未结束字符串可能缺少结束引号
unexpected_tokenJSON.parse 返回 unexpected token存在非法字符或结构错误
too_large超过前端处理阈值输入过大,建议拆分或使用批量处理
copy_failedclipboard 失败浏览器阻止复制,请手动选择文本

JavaScript 的 JSON.parse 错误文案在不同浏览器中可能不同,因此错误类型提取要容错。第一版可以先展示通用 message,再逐步增强行列定位。

测试样例

合法样例:

{"name":"Birdor","tools":["json","jwt"],"pro":false,"count":2}

预期:Format 输出带缩进 JSON,Minify 输出紧凑 JSON,Validate 成功。

嵌套样例:

{"user":{"id":1,"roles":["admin","api"]},"meta":{"active":true,"deletedAt":null}}

预期:嵌套结构缩进正确,数组和 null 保留。

缺少逗号:

{"name":"Birdor" "tools":["json"]}

预期:进入 error,提示语法错误,保留输入。

尾随逗号:

{"name":"Birdor",}

预期:提示 JSON 不支持尾随逗号。

空输入:

预期:提示请粘贴 JSON。

指标

第一版事件:

  • json_format_click
  • json_minify_click
  • json_validate_click
  • json_parse_success
  • json_parse_error
  • json_copy_click
  • json_download_click
  • json_related_tool_click

事件不记录原始 JSON。只记录长度、成功/失败、错误类型、操作类型即可。

验收标准

  • 页面可访问,metadata 正确。
  • 桌面和移动端可完成 format、minify、validate。
  • 非法 JSON 不清空输入。
  • 常见错误有可理解提示。
  • Copy、Download、Sample、Clear 可用。
  • 页面明确说明本地处理。
  • 相关工具和 FAQ 可见。
  • 事件埋点不记录敏感输入。

非目标

第一版不做:

  • AI schema 推断。
  • JSON5。
  • JSON Schema validate。
  • 大文件 Worker。
  • 批量上传。
  • 登录历史。
  • API endpoint。

这些能力可以进入后续版本,但不应阻塞基础工具上线。

延伸阅读

大文件处理策略

JSON Formatter 的第一版不做大文件 Worker,但需要预留策略:

文件大小处理方式用户体验
< 100KB主线程直接处理即时响应
100KB - 1MBWeb Worker 处理轻微延迟,有进度提示
> 1MB提示"文件过大,建议使用批量处理"友好拒绝
> 10MBPro 批量处理 / API引导付费

预留策略意味着:第一版的代码结构应该把格式化处理封装成一个独立函数,方便后续替换为 Worker 调用。

与 YAML/XML 的复用边界

JSON Formatter 完成后,YAML 和 XML 工具可以大量复用:

组件JSONYAMLXML复用度
页面布局 (ToolLayout)是是是100%
代码编辑器 (CodeEditor)是是是100%
操作按钮 (ActionBar)是是是100%
错误面板 (ErrorPanel)是是是80%
格式化逻辑JSON.parseyaml.parsexml2js0%
输出展示缩进 JSON缩进 YAML缩进 XML60%
验证逻辑JSON.parseyaml.validatexml.validate0%

复用重点是"壳"(布局、编辑器、按钮、错误面板),不是"核"(解析逻辑)。

可访问性细节

JSON Formatter 的可访问性要求:

要求实现
键盘导航Tab 顺序:输入区 -> 操作按钮 -> 输出区 -> 复制/下载
屏幕阅读器操作按钮有 aria-label,如"格式化 JSON"
错误通知解析错误时,aria-live=“polite” 朗读错误信息
焦点管理示例加载后焦点移至输入区;格式化成功后焦点移至输出区
颜色不依赖错误不仅用红色,也用图标和文字说明

错误恢复增强

第一版错误提示是基础,后续可以增强:

增强实现优先级
行列定位解析错误时计算行列号P1
错误高亮在输入区标记错误位置背景P1
自动修复建议“是否自动移除尾随逗号?”P2
AI 修复点击"用 AI 修复"自动纠正P2
历史对比显示上次成功输入与当前差异P3

测试覆盖建议

第一版的测试不需要全覆盖,但关键路径必须有测试:

测试类型覆盖范围工具
单元测试format/minify/validate 函数Vitest
集成测试输入 -> 格式化 -> 输出Vitest + React Testing Library
E2E 测试页面完整流程(桌面+移动)Playwright
性能测试大输入(10KB/100KB/1MB)自定义
可访问性测试键盘导航、aria 标签axe-core / Playwright

FAQ 补充

Q: JSON Formatter 是否需要支持 JSON5?
第一版不需要。JSON5 是扩展格式,用户基数远小于标准 JSON。如果后续用户反馈中频繁出现 JSON5 需求,可以作为 Pro 功能或独立工具添加。标准 JSON Formatter 应严格遵循 RFC 8259。

Q: 格式化后的 JSON 应该按字母排序吗?
不应该。JSON 对象的键顺序在 ES2015+ 中是有意义的(按插入顺序)。自动重排序可能破坏用户预期的字段排列。如果需要排序功能,作为独立的"Sort JSON"工具提供,不要在格式化中默认排序。

Q: 输入框应该支持哪些编码?
第一版假设输入是 UTF-8。如果遇到其他编码(如 GBK),应提示"检测到非 UTF-8 编码,请转换为 UTF-8 后重试"。自动编码检测会增加复杂度和体积,不建议第一版加入。

Q: 格式化输出是否应该在 URL 中可分享?
是的,这是高价值功能。可以在 URL query 中编码输入内容(或短ID引用服务端存储),用户分享链接后接收方能看到相同内容。但要注意隐私:如果包含敏感数据,应使用私密模式(不存储在可分享的 URL 中)。

Q: JSON Formatter 是否适合作为 AI 工具的训练示例?
不适合。JSON Formatter 的输出是确定性的,没有需要"智能"判断的空间。AI 的价值在于理解 JSON 的语义(如"这个 JSON 代表什么数据结构"、“如何优化这个 schema”),这些功能可以作为独立的 AI JSON Assistant 工具,不应该污染基础的 JSON Formatter。

JSON Formatter 在 CI/CD 中的集成场景

虽然 JSON Formatter 主要是一个前端网页工具,但它的格式化逻辑可以自然地延伸到 CI/CD 场景:

集成场景触发时机输出工具
提交前格式化git pre-commit hook格式化后的 JSONjq / ppjson
PR 检查GitHub Actions是否格式一致custom script
构建时验证CI pipeline解析成功/失败JSON.parse
发布时压缩release pipelineminified JSONcustom build

Birdor 的 API 版本(/v1/json/format)可以让团队把标准化格式化加入工作流,而不必在每台机器上安装 jq。

JSON 格式化性能基准

不同方案的格式化性能对比(测试数据:10MB JSON):

方案耗时内存环境备注
JSON.stringify(JSON.parse(), null, 2)120ms200MBNode.js最简单,但不是最稳妥
JSON.stringify + 自定义 formatter150ms180MBNode.js可控制空格和换行
jq80ms50MBCLI最快,需安装
Prettier300ms300MBNode.js功能最全
Birdor API< 500ms服务端HTTP适合 CI/CD 集成

前端工具的格式化因为数据量通常 < 100KB,性能差异可以忽略。关键是正确性和错误体验。

JSON Formatter 与 JSON Schema 的关联

JSON Formatter 和 JSON Schema 是互补关系:

需求JSON FormatterJSON Schema Validator
检查语法是(parse)是(parse + schema)
修复格式是(缩进)否
验证结构否是
检查必填字段否是
类型检查否是
提供示例否可以(从 schema 生成)

Birdor 可以在 JSON Formatter 页面底部添加一个"验证 Schema"入口,引导用户到 JSON Schema Validator 工具,形成工作流连接。

FAQ 补充(续)

Q: 是否应该在格式化时自动排序 JSON 键?
不推荐默认排序,但可以作为选项。默认排序会破坏用户预期的字段顺序(比如 API 文档中字段有逻辑顺序)。如果用户需要排序(比如为了 diff 对比),提供一个独立的"Sort Keys"按钮。

Q: JSON Formatter 如何处理循环引用?
标准 JSON 不支持循环引用。如果用户粘贴了一个被序列化了的循环引用对象(比如用 util.inspect 输出),JSON.parse 会失败,应提示"输入包含循环引用或非标准 JSON 结构"。不要用 eval() 或自定义解析器去处理循环引用,这会带来安全问题。

Q: 格式化输出是否支持折叠/展开?
建议作为默认视图的一部分。可以折叠数组和对象,方便查看大型 JSON 的顶层结构。但如果折叠/展开的实现会增加大量 JS 体积,可以放到第二版。第一版至少提供文本输出。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「saas」更多文章

  1. 短链接对 SEO 的影响与优化最佳实践
  2. UTM 参数 + 短链接:追踪每一条营销链路
  3. 私域流量运营中的短链接策略:从引流到转化