XML ⇄ JSON

粘贴任意一种格式,另一种边输入边出现,双向都支持。

怎么用

  1. 把 XML 或 JSON 粘进输入框——结果边输入边出,没有按钮要按。方向由首字符自动识别(< 代表 XML,[ 或 { 代表 JSON),并显示在结果上方,方便核对。
  2. 若方向识别错了,手动选 XML → JSON 或 JSON → XML。选项会随方向变化:XML → JSON 显示“识别数字与布尔”,JSON → XML 显示用于包裹数组的“根元素名”。
  3. 复制或下载结果,两者都与屏幕上看到的完全一致;文件名是 data.json 或 data.xml。“填入示例”会按当前方向填入对应示例。

示例

输入(XML)

<note id="1"><to>Alice</to><from>Bob</from><body>Hi!</body></note>

输出(JSON)

{
  "note": {
    "@id": "1",
    "to": "Alice",
    "from": "Bob",
    "body": "Hi!"
  }
}

id 属性变成“@id”,每个子元素变成一个键,<body> 里的文本变成字符串值。把“识别数字与布尔”关掉,可让所有值(包括 id)都保持文本。

规则、限制与已知问题

  • 不支持上传文件、拖拽或抓取 URL:请直接粘贴文本。拖拽区会挤占结果所需的高度,而真正读文件还要处理非 UTF-8 编码——这部分在 XML 格式化工具里已支持(GB18030、Big5、Windows-1256),去那里打开文件再复制文本即可。
  • 输入上限 1,000,000 个字符;超过 200,000 会等你停手再出结果并提示。超过硬上限会明确报错——绝不静默截断。
  • 映射规则是刻意固定的:元素变成对象;属性变成“@name”;元素文本变成“#text”;子元素变成键;同名子元素变成数组。只有文本的叶子元素直接变成字符串,让深层文档依然清爽。
  • 类型识别(XML → JSON)很保守:只有 true / false / null(仅小写)和严格的 JSON 数字会被转成真类型。带前导零的整数(00501)和 16 位及以上的长数字保持字符串;关掉开关后其余都保持文本。属性永远是文本,绝不会被重新识别类型,因为 XML 属性本质就是文本。
  • JSON → XML 需要单根,所以顶层对象用其唯一键作为根元素。顶层若是 JSON 数组则没有单根,会被包进“根元素名”里,每个元素变成重复的子元素(默认名为“item”)。
  • 键下的值可以是对象、数组、字符串、数字、true / false 或 null。“@name”键变成属性(null / undefined 会被跳过);“#text”变成元素文本;其余键变成子元素。数组产生重复元素。
  • XML 里的注释、处理指令(<? … ?>)和 DOCTYPE 会被丢弃并计数(它们无法用 JSON 表示);CDATA 会保留为文本。混合内容——文本紧贴子元素——会被压平进“#text”,原来的顺序不保留;受影响的元素会被计数,便于你察觉。
  • JSON 解析严格:不允许注释、尾随逗号、单引号或裸控制字符,嵌套最多 64 层。每行一个对象(JSON Lines)暂不支持——请先包进数组。
  • XML 实体引用(&amp; &lt; &gt;)在文本与属性中原样保留(不解码),因此往返能还原完全相同的字节。转义加在 JSON → XML 一侧:文本转义 & < >,属性值额外转义 “。
  • 不在范围内:XSLT、XPath、XML Schema 校验、命名空间(仅作为标签名的一部分)、重复键的 JSON(最后一个生效,同 JSON.parse)、以及保留注释顺序。全程只在本地进行,不上传、不存储、不写入 URL。

数据换好格式之后,通常还会用到这些。