批量格式化XML与JSON文件小工具

JSON/XML 格式化工具 (WPF, .NET 8)

虽然网络上有很多在线的格式化工具,但有时候依然不够方便,这是一款轻量级的 Windows 桌面工具,用于批量/拖拽格式化 XML 与 JSON 文件,支持目录递归、严格校验、编码保留、原子替换/回收站替换、并发处理,以及会话记忆与启动自动处理。

下面是格式化后的结果:

功能特性

  • 拖拽处理:支持拖拽文件或目录到主窗口,目录会递归展开。
  • 快速内容判定 :首个非空白字符为 < 视为 XML,{/[ 视为 JSON,其他跳过;可开启"强制尝试解析"。
  • 严格校验
    • XML:禁用 DTD/外部实体,防注入,合法性检测后再格式化。
    • JSON:严格标准 JSON(不允许注释、尾随逗号)。
  • 格式化与编码
    • XML 使用 XmlWriter,保留/推断编码与 XML 声明;统一 CRLF 行尾。
    • JSON 使用 Utf8JsonWriter,先 2 空格缩进,再根据设置转换为 4 空格或 Tab;统一 CRLF 行尾。
  • 文件替换策略(稳健)
    1. 首选:将原文件移入回收站(如失败则硬删除),再将临时文件重命名为原名。
    2. 回退:File.ReplaceCopy 覆盖,支持 .bak 备份。
  • 并发处理:默认 4 并发,可在设置中调整。
  • 体积/过滤:超过 100MB 的文件自动跳过。
  • 会话记忆
    • 记住拖拽的最近路径列表(LastPaths)。
    • 下次启动可自动加载并处理(可通过配置开关)。
  • 批量确认:展开后文件数超过 5 个时弹出确认对话框(支持本会话记忆)。
  • 应用图标:内置程序化自绘多分辨率 ICO,任务栏/标题栏显示一致。

使用方法

  1. 运行 publish/JsonXmlFormatter.exe(需要 .NET 8 Desktop Runtime)。
  2. 将文件或目录拖拽进窗口。
  3. 如展开后的文件总数 > 5,会弹出确认提示。
  4. 处理完成后,列表显示每个文件的"成功/跳过/失败"状态与说明。
  5. 可勾选"只看失败/跳过",或点击"清空列表"。
  6. 点击"设置"可修改缩进风格、并发数、是否备份 .bak、强制尝试解析、是否记住批量选择等。

配置文件(与 EXE 同名,同目录)

应用启动时会在 EXE 同目录生成或读取与 EXE 同名的 JSON 配置,例如:

json 复制代码
{
  "CenterOnStartup": true,
  "AutoProcessOnStartup": true,
  "LastPaths": [
    "C:\\path\\to\\folder",
    "C:\\path\\to\\file.json"
  ]
}
  • CenterOnStartup:启动时窗口居中(支持多显示器/多 DPI)。
  • AutoProcessOnStartup:启动后自动加载并处理 LastPaths
  • LastPaths:上一次拖拽的文件或目录列表(自动去重)。

注意:本配置不兼容早期版本的配置方式(已改为"与 EXE 同名的 JSON")。

窗口与居中策略

  • 初始尺寸:Width=900Height=520,最小尺寸 MinWidth=800MinHeight=450
  • 启动直接居中:在 SourceInitialized 阶段按当前鼠标所在屏幕工作区 + DPI 缩放计算位置,避免先显示再移动的闪动。

列表与自动处理

  • 列表禁止重复:拖拽相同文件、多次拖拽或"上次列表"自动加载时,均会去重且不重复入队。
  • 自动处理:若 AutoProcessOnStartup=trueLastPaths 非空,启动后会自动处理;若展开 > 5 仍会弹出确认。

注意事项

  • 若文件被"只读"保护或正被其他进程占用,可能导致覆盖失败;程序会尝试移除只读属性与多次重试。
  • 单文件发布模式下,应用在发布目录生成 JsonXmlFormatter.json 配置。不要放在系统受限路径下以免权限问题。
  • JSON/XML 解析严格,请确保文件内容合法。对于非标准 JSON(带注释/尾随逗号)会提示失败。
  • 拖拽目录时,超过 100MB 的文件会被跳过处理。

发布方式

  • 框架依赖的单文件(win-x64):dotnet publish -c Release -r win-x64 -p:PublishSingleFile=true --self-contained false -o ./publish
  • 可执行文件位置:publish/JsonXmlFormatter.exe

技术栈

  • .NET 8.0 WPF(C#),System.Text.JsonSystem.Xml
  • 并发:SemaphoreSlim
  • 图标生成:独立 JsonXmlFormatter.IconGen 项目(SkiaSharp 自绘多分辨率 ICO)

变更要点(近期)

  • 配置迁移:改为"与 EXE 同名的 JSON",新增 CenterOnStartupAutoProcessOnStartupLastPaths
  • 启动居中:在 SourceInitialized 即时居中。
  • 替换策略:新增"回收站删除 + 重命名临时文件",并保留 Replace/Copy 作为回退方案。
  • 列表去重:防止重复入队与重复处理。

常见问题

  • 提示"无法访问文件/权限不足":
    • 可能是目标只读、被占用或杀毒软件拦截;请尝试关闭相关程序或将发布目录加入白名单。
    • 程序会自动重试和回退。若仍失败,请提供"说明"列的完整错误文本。
  • 图标/标题栏不显示:请确认 Assets/app.ico 在发布目录存在(已经配置为总是复制)。

如需新增功能(托盘、右键菜单、更多格式化选项、多语言等),或需要便携版/安装包,请提出需求。

相关推荐
消失的旧时光-19433 小时前
Kotlin JSON 序列化库选型指南:Kotlinx.serialization vs Gson
开发语言·kotlin·json
视觉AI1 天前
HTTP 请求与数据交互全景指南:Request、GET、POST、JSON 及 curl
http·json·交互
还算善良_1 天前
XML签名
xml·java·开发语言
梅梅绵绵冰1 天前
xml方式实现AOP
xml·java·开发语言
愤怒的苹果ext2 天前
MySQL JSON查询与索引
mysql·json·虚拟列·多值索引
dcloud_jibinbin2 天前
【uniapp】解决小程序分包下的json文件编译后生成到主包的问题
前端·性能优化·微信小程序·uni-app·vue·json
Jonathan Star3 天前
Vue JSON结构编辑器组件设计与实现解析
vue.js·编辑器·json
一条晓鱼4 天前
repo xml语法
xml
工业甲酰苯胺4 天前
实现 json path 来评估函数式解析器的损耗
java·前端·json