两者之间没有标准映射。 XML 1.0 有属性、命名空间、有序混合内容和评论; RFC 8259 6种,没有属性,每个转换器都发明了自己的桥,这就是为什么其中两个不同意。
教会我尊重 XML 到 JSON 转换的集成是运输载体's API。堆栈中其他地方的现代 REST,然后是这个说 SOAP 的遗留端点,并返回我需要折叠成 JSON 管道的 XML 信封。 "它's 只是 XML 到 JSON,"我想,并伸手去拿一行转换器。然后边缘情况到达: <Package> 元素有时是一个对象,有时是一个列表,具体取决于顺序中有多少个包。 An id 属性是我的天真转换器完全掉落了,因为它只看元素文本。 A <Description> CDATA包裹,因为它包含一个安培数,这些中的每一个都默默地破坏了数据- JSON出来看起来似乎是合理的,并且在只显示下游三个服务的方式上是错误的。
XML和JSON看起来应该平凡地相互转换,而且它们不't,因为它们用不同的原语对数据进行建模。JSON有对象,数组,字符串,数字,布尔值和空 - 一个小而干净的集合。XML有元素,属性,文本节点,混合内容,命名空间,CDATA,注释和处理指令,关键是它有 没有数组 並 没有类型。所以转换器必须做出无损格式会做的决定n't:当JSON没有对属性有概念时,属性去哪儿了当XML标记两个相同的方式时,你如何从一个项目列表中告诉一个元素,一个同时具有属性和文本的元素会发生什么?
安静 XML 到 JSON 转换器 that故意 - 并一致 - 做出这些决定是干净的集成和下游调试一周之间的区别。我为toolz。dev构建的那个将属性映射到前缀键,因此不会丢失任何内容,将重复标签折叠到JSON数组中,因此保留结构,将混合内容文本保留在专用键下,逐字读取CDATA。并且它使用在浏览器中运行的无依赖性解析器来完成所有这些,这很重要,因为集成有效负载正是您应该't上传到陌生人's服务器的数据类型。
本指南涵盖了转换如何处理 XML' 的结构怪癖、当重复元素成为数组时、如何处理属性和命名空间,以及不断发生此转换的 SOAP 和 RSS 工作流程。
TL;博士: 将 XML 粘贴到 Toolz.dev XML 到 JSON 转换器、选择缩进,并在属性变为的地方获得干净的 JSON
@-前缀键,重复标签变成数组,混合内容文本位于下面#text且CDATA是逐字读取的。可选类型解析转"44.95"成实数。它使用无依赖解析器,运行100%客户端,因此SOAP和集成有效负载永远不会上传,并与之配对 JSON 到 YAML 和 json格式化程序 对于管道中的下一步。
为什么 Isn't XML 到 JSON 是一个简单的一对一映射?
XML和JSON是可互换的直觉来自于他们的共享作业- 表示结构化数据- 并且打破了他们不同的构建块,不匹配出现在四个特定的地方,而转换器's的质量完全是关于它如何处理它们。
属性没有 JSON 等效项。 <book id="bk101">War and Peace</book> 有属性(id)和文本内容(War and Peace)。JSON没有属性的概念;一切都是键值对,一个转换器必须发明一个约定,而广泛使用的是前缀属性键- { "book": { "@id": "bk101", "#text": "War and Peace" } }。掉属性,天真的转换器那样,你've默默丢失数据。
JSON 有数组; XML 没有't。 XML中,一个列表只是重复的相同标签:三个 <item> 一个父级下的元素。但单一的 <item> 1的列表在结构上看起来是相同的,JSON需要知道是发射对象还是数组,唯一可用的信号是发生- 因此重复的标签变成数组,单个标签停留在对象。
混合内容。 1个元素既可以容纳子元素,也可以容纳松散文本,JSON对象可以't自然表示"这个对象也有一个裸字符串值,"所以文本像保留键下 #text。
XML 中存在类型 don't。 XML 中的每个值都是文本。 <price>44.95</price> 是字符串 "44.95"的, 不是一个数字, 除非一个转换器选择强制它 - 并且该选择可能是错误的, 因为 <zip>08544</zip> 必须保持字符串或失去前导零。
的 转换器 显式处理这些中的每一个,而不是假装它们不存在't 存在。那's 为什么输出忠实于源,而不是悄悄地删除 JSON 没有插槽的 XML 部分。
重复元素何时成为数组?
这是 XML 到 JSON 转换中最令人困惑的部分,它'值得理解而不是惊讶。规则 转换器 use 是基于发生的:在给定的父级内,如果一个标签名称出现不止一次,它的值就会崩溃为 JSON 数组;如果它恰好出现一次,它会保留单个对象或值。
所以a <catalog> 有两个 <book> 孩子们生产 { "catalog": { "book": [ {...}, {...} ] } } - 一个数组。但一个 <catalog> 与一个 <book> 生产 { "catalog": { "book": {...} } } - 一个普通的对象,没有数组。
计划的后果是: 1项清单不't看起来像一个清单。 如果您的下游代码期望 catalog.book 要始终是一个数组并在其上迭代,单本书的响应将破坏它,因为 book will是一个特定时间的对象。这是't转换中的一个bug - it's一个不可避免的后果,XML没有标记列表 - 但it's一个真正的gotcha在集成中,项目数量不同。我的运载工具灾难正是这样的:一个包订单返回了一个对象,其中多包订单返回了一个数组,我的代码假设数组。
您的消费代码中的防御模式是标准化:如果字段可以是其中之一,则在迭代之前将其强制为数组([].concat(catalog.book))、知道的 为什么 形状各异,可以让你写下防护装置,而不是被它烧毁。
如何处理属性和命名空间?
属性转换为对象键,其中包含 @ 前缀。 <user role="admin" active="true"> 变成 { "user": { "@role": "admin", "@active": "true" } }。前缀在视觉上保持属性与子元素不同,防止一个属性和一个子元素共享名称的冲突,如果你根本不需要't属性- 你只想要元素数据- the 转换器 有 "忽略属性 " 完全删除它们的选项,以获得更干净的结果。
命名空间作为标签名称的一部分出现。 <soap:Body> 成为一个字面上命名的关键 "soap:Body"、和 xmlns:soap="..." 与其他属性一样,降落在下面 @xmlns:soap。这是务实的选择:将命名空间完全解析到他们的URI会产生笨重的密钥,并且很少匹配集成代码实际想要的,即地址 soap:Body by它熟悉的前缀名。if you're处理SOAP或SVG或任何命名空间词汇,你从XML中知道的前缀是你在JSON中得到的键。
CDATA 部分 - <![CDATA[ ... ]]> XML 携带带有特殊字符的原始文本的块 - 逐字读取,没有实体解码,这正是它们的目的 A. <script> 或 <description> CDATA包裹起来,以保护其安培数和角括号,这些字符完好无损地贯穿其中,在CDATA之外,标准实体(<、 &、和朋友)和数字参考(é、 é的)解码到它们的实际字符。
如何使用该工具将 XML 转换为 JSON?
第 1 步:粘贴您的 XML
任何格式良好的 XML 都有效 - 有或没有 <?xml ?> declaration,有或没有命名空间,声明、doctype、注释、处理指令都是识别和跳过的,因此您可以直接从api响应或文件中粘贴完整的文档,加载样本按钮为您提供一个目录,其中包含属性、嵌套元素和重复标签,因此您可以一次看到每个转换行为。
第 2 步:选择您的选项
JSON 选择 2 或 4 空格缩进。决定是否包含属性或丢弃它们。并选择是否解析类型: 将其关闭,每个值都保留一个字符串(安全、无损); 打开它,明确数字和布尔值成为真正的 JSON 数字和布尔值。当 ZIP 代码或 ID 等值可能具有您需要保留的前导零时,关闭是正确的默认值。
3步:转换和审查
Converter先解析,用特定的消息报告格式错误的标记-不匹配的结束标签,未关闭的元素,未终止的CDATA块-而不是产生垃圾JSON,在成功时,JSON出现线和字节计数,略过它以确认数组与对象的决策符合您的期望。
4步:复制或下载
JSON 复制到剪贴板上,以便粘贴到代码中,或者将其下载为 a .json file。from here 它会掉入请求体、数据存储或你的管道的下一阶段,如果下一步是配置格式,则 JSON 到 YAML 转换器 进一步。
此转换有哪些常见工作流程?
集成旧版 SOAP API
SOAP在企业、银行、物流、政府系统中仍然无处不在,而且它只说XML,当一个现代的JavaScript或Node服务需要消耗一个SOAP响应时,将XML包络转换为JSON是第一步的命名空间保存转换手段 soap:Body 並 soap:Envelope keep住他们熟悉的名字,属性处理保留soap爱挂掉元素的元数据,这也是覆盖在the中的同一类胶水工作 API调试指南。
读取 RSS 和原子馈送
RSS和原子馈送是XML,把它们拉到一个JavaScript应用程序中意味着将它们转换为一个馈送's <item> 元素是教科书的重复标记大小写 - 它们成为 JSON 项目数组,正是您想要的 .map() over 渲染列表。像外壳这样的属性's url 並 type 保留在前缀键下,因此播客和媒体源可以保持其音频链接完好无损。
迁移配置和数据文件
较旧的应用程序将配置和数据存储在 XML 中 - 想想 .config 文件、站点地图、导出数据集、office Open XML 片段。将这些转换为 JSON 是系统现代化或将遗留数据导入 JSON 本机存储中的第一步。当您在此时,类型解析选项非常有用 知道 数字字段是真正的数字字段,希望在目的地输入它们。
测试和原型制作
当你're接线一个数据流,只需要看到一个XML有效负载的形状为JSON - 设计一个TypeScript界面,模拟一个响应,检查一个字段路径 - 在浏览器中的快速转换击败写一次性解析器代码转换,读取结构,写你的类型反对它。
XML 与 JSON:每种格式何时适合?
| XML | JSON | |
|---|---|---|
| 小时代&生态系统 | 企业、肥皂、文档 | Web API、JavaScript、config |
| 属性 | 一流 | 无 - 映射到前缀键 |
| 阵列 | 没有重复的标签意味着列表 | 一流 |
| 类型 | 所有文本 | 字符串、数字、布尔值、空 |
| 评论 | 支持 | 规格中没有 |
| 命名空间 | 一流 | 无 - 保留为前缀键名 |
| 冗长 | 更高的 - 关闭标签、属性 | 下 - 括号和括号 |
| 自然栖息地 | SOAP、RSS/Atom、Office 格式、配置 | REST API、前端数据、 package.json |
表背后的模式:XML 是为文档和企业交换而构建的,其中结构、验证和自我描述很重要;JSON 是为 Web 构建的,其中轻量级和直接映射到 JavaScript 对象很重要。转换方向绝大多数是 XML 到 JSON,因为行业中的运动是从旧的基于 XML 的系统向 JSON 原生前端和服务 - you're 在其所在位置满足遗留数据并将其带入现代管道。该管道的更广泛的格式工具集在 编码工具指南。
转换包含敏感数据的 XML 是否安全?
Integration 有效载荷密集的你不想要泄露的东西':SOAP 响应携带客户记录,配置文件与内部端点和凭据,数据导出与个人信息。而这些正是粘贴到在线转换器中的东西,通常是中集成,通常很匆忙。
的 Toolz.dev 转换器 使用无依赖性解析器在浏览器中完全解析和转换 - 不 DOMParser、没有服务器调用、没有数据离开页面页面加载后断开您的网络,它仍然有效。那's关于工具如何构建的架构事实,而不是政策文档中的承诺,它's整个工具箱背后的浏览器优先原则,详细内容在 数据隐私指南。
标准警告适用:客户端转换保护转换步骤。之后您对 JSON 所做的事情 - 您粘贴它的地方,发送给它 - 是一个单独的决定。但变换本身会将您的 XML 保留在您的计算机上。
常问问题
如何在线将XML转换为JSON?
XML 粘贴到 XML 到 JSON 转换器中,然后单击转换,工具解析 XML,用您选择的缩进和选项将其转换为 JSON,并让您复制或下载结果,处理是 100% 浏览器内 - 没有上传任何内容。
xml 属性如何在 JSON 输出中表示?
Attributes变成了以@为前缀的对象键,所以一个带有id="bk101"的书元素转换为一个"@id"键,这使得属性与子元素不同,如果只需要元素数据,可以使用ignore-attributes选项完全关闭属性输出。
为什么一些 XML 元素变成数组,而另一些则保持对象?
JSON没有办法标记一个元素可以重复,所以转换器使用出现:如果一个标签在同一个父项下出现不止一次,它就变成了一个数组,如果它一旦出现就保持单个对象,这忠实地反映了源,尽管这意味着一个具有一个项目的列表看起来像单个对象而不是数组。
转换器是否处理 CDATA 部分和 XML 实体?
是的。 CDATA 块是逐字读取的,无需实体解码,这是它们的目的。在 CDATA 之外,标准实体如 <、>、&、" 和 ' 以及数字字符引用,如 é 和 é 被解码为它们的实际字符。
我可以将 SOAP 响应或 RSS 提要转换为 JSON 吗?
是的。 SOAP 信封和 RSS 或 Atom 源是普通的 XML,因此它们像任何其他文档一样进行转换。命名空间标签将其前缀保留在键名中 - soap:Body 变为 "soap:Body"键 - 并且重复元素(例如 RSS 项目)变为 JSON 数组,您可以映射过来。
转换后,数字和布尔值会保留为文本吗?
默认情况下是的,因为 XML 没有类型系统,并且像 "007" 或 "1.10" 这样的值可能作为文本有意义。启用类型解析选项,当您想要时,将明确的数字和布尔文本转换为真实的 JSON 数字和布尔文本。
转换包含敏感数据的XML是否安全?
是解析器在浏览器中完全使用 JavaScript 运行 - 没有网络请求携带您的数据,没有记录或存储任何内容,并且该工具离线工作。具有客户记录、内部标识符或集成秘密的 XML 永远不会离开您的机器。
xml和json有什么区别?
XML是一种带有打开和关闭标签、属性、命名空间和注释的标记语言,专为文档和企业数据交换而设计。JSON是一种由对象、数组和原始值构建的更轻的格式,是现代Web API的默认转换。将旧的SOAP或基于Feed的系统与JavaScript前端集成时,将XML转换为JSON是很常见的。
XML和JSON看起来可以互换, aren't, 因为JSON没有属性, 没有逐个重复的数组, 没有文本并存-孩子-确切地放置了一个天真的转换默默地丢失数据。一个转换器, 故意处理那些情况给你JSON that's忠实于来源: 粘贴您的 XML(check)它是如何映射属性和重复标签的,并将干净的数据带入您的管道,而不是看起来合理的损坏。



