YAML / CSV / XML 互转 把四种常见数据格式在浏览器本地互相转换,内部以 JSON 作为中间表示(IR)——源格式先解析成 JS 对象,再按目标格式序列化出去。这样 4 种格式两两之间共 12 条方向都走同一条管道,行为一致。
| 格式 | 库 | 说明 |
|---|---|---|
| YAML | yaml | YAML 1.2,支持注释/锚点(解析时展开) |
| CSV | papaparse | 容错、类型推断、多种分隔符 |
| XML | fast-xml-parser | 纯 JS,解析 + 生成一体,属性按 @ 前缀 |
| JSON | 原生 | JSON.parse / JSON.stringify |
CSV 不能表达嵌套,工具提供两种方式。默认扁平化——user.name、user.addr.city 各为一列,反向解析按 . 还原结构;另一种是保留为 JSON 字符串,嵌套值原样塞进单元格(适合下游还要用代码解析的场景)。数组元素默认用 | 连接原始值。
XML 必须唯一根,JSON 数组没有。生成 XML 时若源是数组,会自动包一层 <root><row>...</row></root>,根名和行名都可在选项里改。
⌘/Ctrl + Enter 触发一次转换(实时模式开着时也可手动强制)。支持拖拽文件到输入框,按扩展名自动切源格式。
CSV 本质是二维表格,没有嵌套语法。工具默认"点号路径"扁平化:{ user: { name: "Alice" } } → 列名 user.name,反向按 . 拆回去,嵌套对象完全可往返。对象数组或嵌套复杂值会被 JSON.stringify 塞进单元格;开启"类型推断"时工具会在读回时尝试 JSON.parse,也能往返。但基本类型数组(["a","b","c"])默认用 | 连接便于阅读 —— 这一步不可逆,CSV 再转回去会变成字符串 "a|b|c"。若需要基本数组也可往返,切"JSON 字符串"模式,数组会编码为 ["a","b","c"] 写入单元格。
<root> / <row>?XML 必须有唯一根节点,JSON/YAML 数组没有这个约束。工具在序列化时会自动包一层:数组 [a, b] → <root><row>a</row><row>b</row></root>。根节点名和数组元素名都可以在选项里改(默认 root / row)。反向解析时如果输入本来就有单一根节点,不会再套一层。
"123" 会被当成数字吗?默认会。工具启用了 papaparse 的 dynamicTyping,会自动把 123 → 数字、true/false → 布尔、空字符串 → null。如果字段必须保留为字符串(比如身份证号、手机号前导零),关掉"类型推断"即可。
硬上限 5 MB,超过会在打开文件时拒绝。实际上到 1–2 MB 的 YAML/XML 解析在浏览器里已有感知延迟——如果文件更大,建议先在本地用脚本转换。
解析时会被 yaml 库展开成具体值,所以转回 YAML 后不再是引用形式。如果需要保留结构,YAML → YAML 这条路径工具也没法还原原样——本质上这是解析环节就丢失的信息。
不会。yaml、papaparse、fast-xml-parser 三个库全部在浏览器本地运行,数据不出机器。浏览器关闭后,localStorage 只保留最近一次的输入作为草稿,可以随时清空。
属性会按 @attr 的 key 形式映射到 JSON/YAML。比如 <user id="1">Alice</user> 解析为 { user: { "@id": 1, "#text": "Alice" } }。反向生成时,以 @ 开头的键会被还原成属性。这个约定是 fast-xml-parser 的默认,可以在输出里看到效果。