XML 转 JSON

XML 和 JSON 对数据的建模方式不同:XML 有属性和混合内容,JSON 有对象和数组。要做到无损转换需要一种约定。这个工具提供三种:紧凑(丢弃属性)、Badgerfish(属性放在 @key 下,文本放在 $ 下)和字面式(每个 XML 节点都变成一个保真度完整的 JSON 对象)。选一个与你目标 JSON 消费方相匹配的即可。

如何把 XML 转成 JSON

  1. 1

    粘贴 XML

    任意格式良好的 XML。命名空间会被保留。

  2. 2

    选择转换风格

    紧凑、Badgerfish 或字面式/无损。

  3. 3

    处理数组

    强制某些元素始终为数组(可配置)。

  4. 4

    复制 JSON 输出

    美化或压缩,随你选择。

三种风格对比

输入:

<book id="1" lang="en">
  <title>1984</title>
  <author>Orwell</author>
</book>

紧凑(丢弃属性):

{
  "book": {
    "title": "1984",
    "author": "Orwell"
  }
}

Badgerfish(属性放在 @ 下,文本放在 $ 下):

{
  "book": {
    "@id": "1",
    "@lang": "en",
    "title": { "$": "1984" },
    "author": { "$": "Orwell" }
  }
}

字面式 / 类 JsonML(保真度完整):

{
  "book": {
    "@attributes": { "id": "1", "lang": "en" },
    "title": "1984",
    "author": "Orwell"
  }
}

强制数组

XML 没办法表达「这是只有一个元素的列表」。单元素序列看起来和标量一模一样:

<items>
  <item>A</item>
</items>

它可以序列化为 {"item": "A"} 或 {"item": ["A"]}。转换工具让你把某些元素名(按 XPath)标记为始终是数组,这样你的下游 JSON 消费方就能得到一致的类型。

混合内容

混合内容,文本与子元素交错,是任何 XML 转 JSON 都会丢失信息的地方:

<p>Hello <em>world</em>!</p>

大多数风格要么丢掉文本,要么把它折叠掉。字面式风格通过数组保留顺序:

{
  "p": {
    "@content": ["Hello ", { "em": "world" }, "!"]
  }
}

类型推断

默认情况下值都是字符串。打开「解析数字/布尔值」,转换工具就会把 42、3.14、true、false 转成对应的 JSON 类型。要小心:开启类型转换后,XML 属性 id="007" 会变成 7,这很可能不是你想要的。

该选哪一种

  • 紧凑: 用于属性是噪音、追求人类可读的 JSON。
  • Badgerfish: 当你需要属性和文本与子元素处于同一深度时。
  • 字面式: 当你必须无损地往返回 XML 时。

常见问题

当某个元素只出现一次时,转换工具默认用对象;出现两次或更多时用数组。如果你的消费方期望某种固定形态,用强制数组选项让它保持一致。

除非你启用「剥离命名空间」,否则命名空间前缀会保留在键中(ns:title)。声明本身会变成根元素上的 @xmlns:ns 属性。

字面式模式最接近无损,但元素与文本之间混合内容的顺序很棘手。紧凑模式肯定会丢失属性。Badgerfish 是一种务实的折中。

不会。转换在你的浏览器中运行。

相关工具

此工具还提供其他语言版本