为什么在XML中嵌入JSON不好?

为什么在XML中嵌入JSON不好?,xml,json,language-agnostic,format,Xml,Json,Language Agnostic,Format,我的直觉告诉我,将一种格式转换成另一种格式是错误的,但我似乎找不出具体的原因 <root> <stuff> thing </stuff> <more> <[!CDATA[{"a":["b","c"]}]]> </more> </root> 事情 而不是仅仅把它放在xml中 <root> <stuff> thing </stuff> <mor

我的直觉告诉我,将一种格式转换成另一种格式是错误的,但我似乎找不出具体的原因

<root>
 <stuff>
  thing
 </stuff>
 <more>
  <[!CDATA[{"a":["b","c"]}]]>
 </more>
</root>

事情
而不是仅仅把它放在xml中

<root>
 <stuff>
  thing
 </stuff>
 <more>
  <a>
   b
  </a>
  <a>
   c
  </a>
 </more>
</root>

事情
B
C
从逻辑上讲,这两个部分将由不同的代码进行解析,但作为交换格式,可以混合和匹配语法吗


如果我们有一个解析JSON响应的现有端点,您的答案会改变吗?我们必须重新编码此端点以进行XML摄取。

作为一种交换格式,使用两种格式会给希望与您交互的人带来额外负担。现在他们需要一个XML解析器和一个JSON解析器

这也使得人们更难摸索格式,因为当考虑文件的不同部分时,他们必须在思想上进行转换


最后,您将无法轻松完成同时查看整个结构的操作。例如,不能使用XPath获取JSON位,也不能将整个响应视为JavaScript对象。混合使用两种格式,在处理数据时会遇到“两全其美”的问题。

这有点像数据库规范化辩论。使用纯XML(或规范化数据库模式)做任何事情都更干净、更优雅,这样就不会不必要地与特定的实现耦合。但是,如果必须将XML转换为JavaScript对象(或者为每个该死的
SELECT
连接5个表),那么最终可能会编写大量额外的代码,并导致不必要的性能损失


这完全取决于你如何平衡方便和形式正确。如果这是一种将由W3C标准化并被数百万人使用的XML交换格式,那么亲爱的上帝,不要使用JSON。如果这是一个内部应用程序,它只能由您自己编写的代码进行处理,那么去它的,只需将JSON放在那里,然后继续

在我看来,XML是首选的数据传输表示形式,但JSON在映射和数组方面的表现力要强得多。我不反对将JSON嵌入xml来表示列表或地图。

这并不是天生的错误。如果你有理由这样做,而其他选择更糟糕,那么你应该这样做。正如总是一个解决方案需要在其运行的环境中进行判断(该死的学者)

在我的例子中,我有一个具有RESTful JSON API的全局数据库,这是一项欧盟法规,规定我必须创建一个本地副本,如果无法访问全局数据库,则可以从该副本访问数据,并且基础设施建基于SOAP和XML

对于日常操作,我们只需要百字段JSON记录中的五个字段。所以,不,我不会假装纯粹主义带来了好的解决方案,并为我们的API基础设施引入了一个全新的标准。我将提取所需的几个字段,并将其余字段作为JSON包装在CDATA部分中返回


当然,我们的客户机应用程序不使用XML解析器,因此不需要使用两个解析器。他们使用SOAP框架为他们进行解析。

首先,我意识到我是在问这个问题8年后发布的,但我保证我相信我有充分的理由这么做

我同意所有认为这是错误的理由,但总有一些边界情况出现。例如,我正在处理一些具有某些要求的遗留应用程序:

  • 与外部系统的通信必须使用SOAP
  • SOAP通信必须由WSDL文件描述
  • 我们的系统必须接收并编译WSDL文件以供使用,该文件生成一系列已编译的Java类和方法
  • 如果WSDL被更新,我们的系统必须重新编译WSDL,这需要遵循完整的更改过程,这可能需要几个月的时间
  • 需要接收来自我们的SOAP数据的“他们的系统”正在由一个完全独立的团队开发和维护,并且存在各种障碍,禁止这两个团队实际合作。(基本上,我们只有一次机会让他们可以在必要时使用和扩展某些东西;任何来回都会将项目延迟数月)
  • 上述因素都不能改变或质疑
    考虑到所有这些因素,我认为XML中的JSON绝对是解决这个问题的最佳方法。这允许我们在数据中仍然保留有意义的参数,同时避免将来对WSDL进行任何更改

    为什么将sqlite文件存储为数据库中的blob不好?如果我们有一个解析JSON响应的现有端点,您的答案会改变吗?我们必须为XML摄取重新编码此端点;XML解析器之上的JSON解析器——那么您的问题的答案将是关于可移植性、可读性、可维护性和简单的老式品味。当然,它现在可以工作了,但是想想谁将来可能会阅读它,你可能会把XML传递给谁,你将如何向他们解释为什么他们需要一个JSON解析器,等等。看起来您现在确实在推迟工作,这可能会导致以后创建更多的工作。@Paul:如果它适用于您当前的实现,那么现在就没有理由更改它。然而,如果你开始想出创造性的(读作:臭)方法来解决劳伦斯描述的问题,那就是你想要坚持其中之一的时候了。好的做法是好的。但它们不能取代良好的思维。有时,知道模式不是解决问题的最佳方法。有时候黑客是正确的。无论你做什么,都要知道你为什么这么做,而且越是凌乱,你就越需要记录它,并将凌乱封装到某个地方,以便有一天你可以轻松地替换它……)