拿到一份 XML 响应,想临时整理成 JSON 交给程序处理,可以使用宝塔拨测的“XML/JSON互转”。转换前要先看数据长什么样:商品列表这样的规则节点比较容易对照,正文里夹着标签的混合内容则要格外小心。

本文用虚构商品目录演示当前工具的映射方式,再用一个短段落核对往返边界。转换前保留原文,以下规则是本工具当前的实际输出,不应当作所有 XML/JSON 转换器通用的约定。

属性和重复节点,转换后放在哪里

进入“XML/JSON互转”,保持“XML → JSON”,将下面内容粘进“XML 输入”,点击“转换为 JSON”:

<catalog region="demo"><item id="a">Alpha</item><item id="b">Beta</item><count>2</count><enabled>true</enabled></catalog>

输入包含一个根节点 catalog,它有 region 属性。两个同名 item 是重复子节点,每个 item 又带一个 id 属性和一段文字。右侧输出会保留根节点名称,并将这些内容分别放进不同字段。

右侧 JSON 中,catalog 的属性进入 _attributes,同名 item 节点展开为数组
右侧 JSON 中,catalog 的属性进入 _attributes,同名 item 节点展开为数组

本次的 catalog.region 被写成 catalog 下的 _attributes.region,两个 item 放进同一个数组。每个数组项里,属性放进 _attributes,文字放进 _text。第一项的结构是:

{
  "_attributes": { "id": "a" },
  "_text": "Alpha"
}

如果后续要写程序取商品名称,应读取每个数组项的 _text;取编号则读取 _attributes.id。不能沿用另一款转换器的字段名,直接假设属性一定以 @id 表示,或节点文字就是一个裸字符串。

另外,输入中的 <count>2</count> 和 <enabled>true</enabled> 转换后,其 _text 分别是字符串 "2" 和 "true"。XML 的文字看起来像数字或布尔值,也不会在这个例子中自动变成 JSON 数值和布尔值。如果接收接口要求真正的数字,需要按接口约定单独处理类型,不能只改扩展名就完成数据适配。

把 JSON 转回来,再对一次字段

先复制刚才输出的完整 JSON,确认包含最外层的大括号,再切换到“JSON → XML”,粘进“JSON 输入”,点击“转换为 XML”。右侧生成 XML 后,可在框内滚动检查末尾,核对根节点的结束标签是否完整。

将完整结果放进反向转换页后,region 和两个 item 的 id 重新输出为 XML 属性
将完整结果放进反向转换页后,region 和两个 item 的 id 重新输出为 XML 属性

这份普通节点示例可以重新得到 region="demo"、两个 item 的 id 和对应文字,count 与 enabled 也保留。工具还输出了 XML 声明和缩进,因此文本排版与原来一行的输入不同。

这里验证的是这组字段按本工具的映射成功往返。正式使用前,仍要数一下重复节点有没有少,属性是否回到正确节点,文字是否完整。接收方如果要求特定根节点、命名空间或其他结构,也要逐项确认。本次示例没有覆盖那些情况,不能由一次成功往返推断任意文档都能无损处理。

正文夹标签时,先做小样本测试

很多文章片段并非纯粹的字段列表。例如这段内容把“重点”加粗,前后还各有一段普通文字,并带一条注释:

<p>前文<strong>重点</strong>后文<!--备注--></p>

切回“XML → JSON”,将这段内容转换后,本次结果是:

{
  "p": {
    "strong": { "_text": "重点" },
    "_text": "前文后文"
  }
}
混合内容转换后,前文与后文被合到同一个 _text,注释没有出现在 JSON 中
混合内容转换后,前文与后文被合到同一个 _text,注释没有出现在 JSON 中

原来“前文—strong 节点—后文”的相对位置,在这个 JSON 结构中已经没有完整保存;注释也没有保留。仅看 strong 和 _text 都有值,容易误以为内容齐全,但它们不足以重建原来的排列。

再把这份 JSON 复制到“JSON → XML”里转换,本次实际只得到:

<?xml version="1.0" encoding="UTF-8"?>
<p>
  <strong>重点</strong>
</p>
将混合内容的 JSON 再转回 XML,本次结果只剩 strong 节点,前文和后文没有恢复
将混合内容的 JSON 再转回 XML,本次结果只剩 strong 节点,前文和后文没有恢复

这一步不仅改变了排版,“前文”和“后文”也未恢复。遇到这种内容,不要继续把结果当成原文的等价副本。保留原 XML,将要处理的文档交给支持保留节点顺序、文本节点及注释的专用解析流程,并用实际文档做往返对比。

如果只是从规则 XML 中临时提取几个字段,本工具可以帮助看清属性和数组的映射。若任务要求完整还原文档,应先把最有代表性的片段转过去再转回来;一旦出现上面的文字丢失,就停止用这条转换链覆盖原文件。