MooTool Next 原生版 JSON 工作区与独立解析引擎:SwiftUI + JavaScriptCore 的安全架构解析
桌面应用开发工具【免费下载链接】MooToolHandy tool set for developers项目地址https://gitcode.com/gh_mirrors/mo/MooTool点击查看免费下载导读本文聚焦 MooTool 跨平台新一代产品线next-macos-native中 JSON 工具的核心设计一个由 SwiftUI / AppKit 构建的完整 JSON 工作区以及一套基于系统 JavaScriptCore、运行在独立辅助进程中的 JSON 解析引擎。阅读本文后你将理解 MooTool 如何在不依赖 Node.js、Electron 与网络服务的条件下将 Electron 版 JSON 工具的格式化、JSONPath 查询、XML / JavaBean 转换与查找替换能力完整移植到 macOS 原生平台并掌握其进程隔离、超时控制、三语文案与能力边界的实现细节。该产品线的完整对齐口径见 parity.md本主题的官方说明见 json-engine.md。JSON 工作区的界面骨架MooTool Next 原生版 0.4.0 起JSON 工具采用与 Electron 版对应的工作区布局由以下核心区域组成工具栏承载格式化、压缩、查找、检查器开关等主要操作主编辑器基于原生 NSTextView 的 JSON 正文编辑区可折叠检查器用于结构树、路径选择与值预览查找替换栏支持 JavaScript 正则语义的查找与替换路径选择器与转换结果弹窗展示 JSONPath 查询结果与转换输出。这一布局明确以 Electron 端的 JsonTool.tsx、JsonToolbar.tsx、JsonInspector.tsx、JsonToolDialogs.tsx 为参照实现面板顺序与主要操作语义保持一致但控件全部采用 macOS 原生组件。在窄编辑区场景下部分工具栏操作会被收纳进更多菜单检查器通过弹出面板打开整体交互遵循 macOS 的菜单、分栏与弹窗惯例而非逐像素复刻 Electron 页面。操作语义哪些操作原地生效哪些进入结果弹窗JSON 工具的操作按是否直接修改正文分为两类这是理解该工作区行为的关键直接更新主编辑器的操作可撤销/重做并保存到当前文档格式化format以 2 空格缩进重新序列化正文压缩compress移除所有空白的最紧凑形式高级格式化advanced支持自定义缩进、按键排序、忽略大小写排序与重复键检测键值互换swap仅针对 JSON 对象执行交换键与值值必须是可作键的类型转义 / 反转义escape / unescape含 Java 字符串风格的 escapeText / unescapeText。在结果弹窗中展示的操作可复制、导出、使用结果使用前不替换正文JSONPath 查询query路径选择器填入 JSONPath 后执行JSON → XMLjsonToXmlJSON → JavaBeanjsonToBean生成 Java 类源码。先输入来源、再替换正文的操作XML → JSONxmlToJson先在弹窗中粘贴 XML转换成功后替换主编辑器正文JavaBean → JSONbeanToJson同样先输入 Java 字段声明源码再生成 JSON 替换正文。这些 action 的分发逻辑集中在随包发布的 JSONDispatch.js 的runJSONRequest(payload)中每个 case 对应一种操作语义错误信息通过translate()按请求携带的language返回 zh-CN / en-US / ja-JP 三种语言。查找替换沿袭 JavaScript 正则语义查找替换find / replace / replaceAll在 JSONTools.js 中实现与 Electron 版完全同源支持大小写匹配matchCase、全词匹配wholeWord用\b包裹、正则模式regex支持向前 / 向后导航、捕获组替换模板与换行替换\n、\r、\t正则标志使用gu/giu因此matchAll返回的索引是代码点级别的 UTF-16 偏移替换选中区时仅当选区恰好整体等于唯一匹配时才原地替换该选区高亮使用 NSTextView 的临时属性实现不写入文档内容。在CoreTests.swift中有对应验证如testJSONNativeFindReplaceUnicodeAndFlags断言item(\d)正则替换$1\n能正确生成换行、反向查找返回正确起始偏移、非法正则[会抛出错误见 CoreTests.swift。路径选择器字面路径优先复杂表达式交给 JSONPath-Plus路径选择器生成两类路径字面路径literal path如$.store.books[0]、$[特殊 键名]由 JSONDispatch.js 的literalPathTokens()解析逐段保留数字、引号、方括号、反斜杠转义与换行等特殊键名不做表达式求值复杂表达式如通配符、递归、筛选、切片、联合查询交给 JSONPath-Plus 10.4.0 求值严格 JSON Pointer以/开头的路径走pointerQuery()支持~0~与~1/转义、数组下标合法性校验与路径存在性校验。右侧菜单仍可复制 JSON Pointer。结构树节点同时携带pointerJSON Pointer与queryPathJSONPath 形式两个标识见 JSONStructure.swift 的JSONTreeNode测试testJSONNativePathsMatchElectronQueries中$[0]与$.array[0]的映射关系即由此而来。独立解析引擎Swift 宿主 JavaScriptCore JS 算法副本MooTool 原生版没有在 macOS 应用内重写全部 JSON 算法而是采用独立解析引擎架构算法层JSONTools.js是 MooTool 对应纯算法的独立副本在本产品内维护并包含 Java 字段名 / 类名冲突处理等原生版修正执行层系统 [JavaScriptCore] 的JSContext在随应用打包的MooToolJSONWorker辅助进程中执行这些算法分发层JSONDispatch.js负责把 Swift 结构化请求转换为具体算法调用并统一本地化错误信息宿主层Swift 侧 JSONEngine.swift 负责请求构造、进程生命周期与结果回传。三个 Swift target 的关系记录在 Package.swiftMooToolJSONWorker是独立可执行文件依赖MooToolNextCoreMooToolNextApp是主应用MooToolNextCore同时被两者依赖承担算法资源封装。请求-响应协议请求由 JSONEngineRequest 描述核心字段包括字段默认值说明action无操作类型format / compress / advanced / swap / escape / unescape / query / jsonToXml / xmlToJson / beanToJson / jsonToBean / find / replace / replaceAll / duplicates / validate 等input无正文输入最大 10 MB UTF-8path$JSONPath 或 JSON PointerclassNameRootJSON → JavaBean 的根类名最长 240 字符indent2高级格式化缩进空格数sortKeys/ignoreCasefalse排序开关与排序时的大小写不敏感checkDuplicateKeystrue高级格式化时是否检测重复键query/replacement空查找内容与替换内容替换最长 1 MBmatchCase/wholeWord/regexfalse查找替换三个标志selectionStart/selectionEnd0当前光标 / 选区位置UTF-16forwardtrue导航方向languagezh-CN错误信息语言响应为 JSONEngineReplyvalue结果正文、error错误信息、count命中数、match/matches查找定位信息。数据传参JSON 请求文件而非脚本源码一个关键的安全设计是用户输入永远作为数据传入绝不拼接为脚本源码。JSONEngine.runWorker会为每次调用创建独立的临时目录命名前缀为产品ID-json-UUID目录权限 0700、文件权限 0600把编码后的请求写入input文件worker 从标准输入读取、结果写入output文件。worker 进程的环境变量被简化为LANGen_US.UTF-8不继承 shell 启动路径、注入的运行时路径与用户环境密钥见 JSONEngine.swift。JSONDispatch.js首行注释也明确写着// Native-product boundary: all caller text is data, never script source.。JSONPath 求值使用eval: safe禁用动态表达式求值测试 CoreTests.swift 专门断言.constructor.constructor(return process)()这类注入表达式会被拒绝。辅助进程不向脚本暴露任何原生文件、网络或进程对象。超时与取消双层保险辅助进程的终止由两层机制兜底父进程 3 秒超时JSONEngine.execute(_:timeout:)默认 3 秒轮询期间一旦超过deadline就对 worker 发送SIGKILL并抛出超时错误json.engine.timeoutworker 自身 4 秒硬终止main.swift 中signal(SIGALRM, SIG_DFL)后调用alarm(4)即使主应用异常退出耗时表达式也会在 4 秒后被系统信号终止用户取消withTaskCancellationHandlerWorkerCancellation在任务取消时同样SIGKILL终止进行中的进程并抛CancellationError。输出文件也会被监控一旦超过 16 MB 即终止本次调用。每次调用结束都会删除临时目录。测试testJSONWorkerTimeoutCancellationAndIsolation用灾难性正则(a)$验证了超时与取消路径。多窗口与文档切换语义关闭无关窗口不会取消另一窗口的操作切换文档、恢复工作区或修改正文后旧的异步结果不会自动覆盖新内容。依赖与产品边界查询与 XML 转换依赖两个第三方库版本与校验信息集中在 parser-versions.json依赖版本用途发行文件 SHA-256JSONPath-Plus10.4.0JSONPath 查询含 jsep 表达式解析ed2274eecaf6c8209eab8ebf991ef9319e23f4886296a257e84aaa055bfed097fast-xml-parser5.10.1XML 解析 / 构建含 fast-xml-builder、strnum、is-unsafe 等子依赖fa2f3be3e78aab26a7a04be70fdceb7dede6981a4d1a0e2ca25c30bcef194f2e浏览器发行文件与许可副本全部位于本产品Sources/MooToolNextCore/Resources/包括jsonpath-plus.js、fast-xml-parser.js、JSONTools.js、JSONDispatch.js、QuickNoteTools.js、ReformatTools.js及各库的 LICENSE 文件。这意味着构建和运行不读取nextElectron 源码或node_modules不要求 Node.js、Electron、浏览器或任何网络服务JSON 数据不会发送到远端所有解析都在本机辅助进程中完成产物本身随包分发离线可用。JSONTools.js是本产品内维护的独立算法副本与 Electron 版next/src/features/json/jsonTools.ts同源但针对原生版需求做了一处显著修正Java 字段名 / 类名冲突处理详见下文 JavaBean 一节。能力边界与限制为保持与 Electron 版一致的解析语义并保证辅助进程安全引擎设定如下边界原文见 json-engine.md 能力边界一节实现见 JSONEngine.swift 与 JSONDispatch.js维度限制单次正文最多 10 MBevaluateLocally校验请求 / 结果最多 16 MB编码后二进制大小JSON 规模最多 10 万节点、128 层checkShape遍历计数结构树 / 查询 / 查找结果最多 2 万项JSONStructure的nodeLimit与 query / find 的count上限父进程超时默认 3 秒worker 终止计时独立 4 秒alarm(4)替换模板最多 1 MBUTF-8JSONPath / 查询文本最多 16 KBUTF-8类名最多 240 字符UTF-8超过任一限制即返回本地化错误如json.error.nodeLimitJSON 最多处理 10 万节点、128 层json.error.queryTooManyResults查询结果超过 2 万项。JSON 数字语义JavaScript NumberJSON 数字按 JavaScript 的 Number 语义处理与 Electron 一致——例如大整数超过Number.MAX_SAFE_INTEGER时精度会丢失。引擎不提供任意精度数字保证这一行为对齐 Electron 基线属于有意边界而非缺陷。XML 转换规则输入使用严格语法校验XMLValidator.validate不接收 DTD 或实体声明![DOCTYPE / ENTITY ...]会直接拒绝测试用file:///etc/hosts实体注入用例验证XML → JSON 的属性使用_前缀如_enabled重复元素合并为数组值的数值 / 布尔推断沿用 fast-xml-parser 的解析行为JSON → XML 自动转义特殊字符如转amp;解析器抛出的英文msg仍可能透传如 XML 语法错误的原始消息。JavaBean 双向转换规则JavaBean → JSONjavaBeanToJson用正则解析字段声明支持public/protected/private、static/final/transient/volatile修饰符与泛型类型为每个字段生成示例值mockJavaValueString 生成空串、int 生成 0、List 生成空数组等跳过serialVersionUID。它不执行 Java 代码也不做完整 Java 编译器级类型分析。JSON → JavaBeanjsonToBean生成字段与嵌套类源码核心逻辑在 JSONTools.js 的buildNativeJavaClass自动加入import java.util.List;类型推断null →Object、整数 →Long、小数 →Double、布尔 →Boolean、字符串 →String、数组按元素类型推导ListT混合类型数组使用ObjectListObject关键字处理字段名命中 Java 关键字class、new、record等内置javaKeywords集合时转换为合法标识符如class→classValue命名冲突处理字段重名追加数字后缀a_b与a-b都转成下划线形式时后者变为a_b2类名与String、List、Object、Boolean、Long、Double等内置类型冲突时追加数字后缀Root与List冲突时生成List2嵌套String类变成String2逻辑由unique(base, used)与occupiedTypes集合实现嵌套对象生成为public static class内部类类名遵循驼峰命名toPascalCase。测试 CoreTests.swift 的testJSONNativeXMLAndJavaConversions与testJSONNativeEscapesAndKeyValueSwap完整覆盖了上述规则包括{string:{...},list:[...],object:{...}}用类名List时的多层重命名。仓库本机另用javac实际编译辅助进程生成的 Java 文件覆盖关键字、字段重名、嵌套类型、混合数组和 String/List/Object 命名冲突确保生成源码可编译。工作区与文档库边界窗口间同步正文多个窗口编辑同一文档时正文保持同步撤销记录属于当前编辑器其他窗口写入正文时会清理本窗口可能已过期的撤销记录重启不恢复撤销栈Monaco 尚未移植Monaco 编辑器的全部快捷操作、折叠和编辑装饰尚未移植到原生版文档库生态JSON 文档支持镜像到json-vault/、FSEvents 监听外部改动、Finder 定位以及 Vault Git 面板Diff、丢弃、合并 / 变基与冲突处理与 Electron 的差异见 parity.md。验证体系原生 JSON 引擎的验证分三层核心测试MooToolNextCoreTests对照 Electron 输入输出用例覆盖通配符、递归、筛选、切片、联合查询、特殊键路径、重复键、XML 拒绝项DTD / 实体 / 语法错误、Java 命名、Unicode 查找替换、工作区兼容以及辅助进程超时和取消见 CoreTests.swift 的testJSONNativePathsMatchElectronQueries、testJSONNativeXMLAndJavaConversions、testJSONNativeFindReplaceUnicodeAndFlags、testJSONWorkerTimeoutCancellationAndIsolation等用例javac 实编译对jsonToBean生成的 Java 文件用本机javac实际编译覆盖关键字、字段重名、嵌套类型、混合数组与命名冲突场景原生验收发送格式化快捷键并操作实际编辑器验证原地修改、自动保存、撤销/重做、结果弹窗、使用结果、输入转换及文档切换再通过新进程检查工作区恢复。界面截图覆盖检查器、查找栏、路径选择器、结果弹窗及深浅色 / 窄窗口。需要说明的是截图成功不等于所有菜单和系统对话框均已做端到端验证。小结MooTool Next 原生版的 JSON 引擎是一套算法同源、执行隔离、行为对齐的架构算法层直接继承 Electron 版的jsonTools.ts逻辑并以JSONTools.js独立维护执行层利用系统 JavaScriptCore 与独立辅助进程实现离线解析与安全隔离交互层以 SwiftUI / AppKit 原生控件对齐 Electron 工作区。对于需要移植复杂 Web 工具到桌面原生平台的开发者其浏览器发行文件随包分发 临时文件传参 双层超时 三语错误的组合方案具有直接的参考价值。完整边界说明见 json-engine.md功能对齐总表见 parity.md。赞分享桌面应用开发工具【免费下载链接】MooToolHandy tool set for developers项目地址https://gitcode.com/gh_mirrors/mo/MooTool点击查看免费下载相关推荐告别模糊视频Video2X如何用AI智能提升画质和流畅度告别模糊视频Video2X如何用AI智能提升画质和流畅度 你是否曾因模糊的老旧家庭录像而遗憾是否下载过低分辨率影片却无法享受高清体验传统视频放大技术只是简音视频视频处理图像处理人工智能MooTool Next Compose用 Compose Multiplatform 构建独立桌面工具集的工程实践MooTool Next Compose用 Compose Multiplatform 构建独立桌面工具集的工程实践 本文基于仓库中的 next compos桌面应用开发工具caveman cacheengine独立运行的 Provider 原生 Prompt Cache 规划器与 Wire 引擎深度解析caveman cacheengine独立运行的 Provider 原生 Prompt Cache 规划器与 Wire 引擎深度解析 本文围绕 caveman人工智能AI 应用AI Agent提示工程开发工具MCP 服务上一篇3个问题帮你判断思源笔记是否值得你投入时间学习下一篇B站视频永久保存终极指南10分钟掌握m4s转mp4专业技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考