从XML规范模型返回JSON的策略

从XML规范模型返回JSON的策略,json,xml,marklogic,marklogic-8,Json,Xml,Marklogic,Marklogic 8,我使用的是信封模式,我的规范模型部分是XML格式的。我通常返回模型的完整版本或摘要版本。文档的检索非常快,但是当作为REST调用的一部分返回时,我需要将JSON返回到浏览器,我的JSON:transform to JSON将使用仅返回XML的调用的两倍版本 是否有一种策略可以同时在信封中使用JSON格式的规范模型,或者在信封之外的其他文档中以完整和摘要格式呈现JSON,这些文档不会被搜索,但主要用于返回结果?这样,我就不必因为一直将规范模型转换为JSON而受到打击 还有其他方法可以做到这一点吗?

我使用的是信封模式,我的规范模型部分是XML格式的。我通常返回模型的完整版本或摘要版本。文档的检索非常快,但是当作为REST调用的一部分返回时,我需要将JSON返回到浏览器,我的JSON:transform to JSON将使用仅返回XML的调用的两倍版本

是否有一种策略可以同时在信封中使用JSON格式的规范模型,或者在信封之外的其他文档中以完整和摘要格式呈现JSON,这些文档不会被搜索,但主要用于返回结果?这样,我就不必因为一直将规范模型转换为JSON而受到打击


还有其他方法可以做到这一点吗?

从XML到JSON的转换应该相对较轻,但仅仅是它必须做一些事情这一事实就需要开销。提前做这项工作肯定会节省时间。您可以将这两种格式放在同一个信封中(尽管JSON必须存储为字符串),也可以按照您的建议放在不同的文档中。或者,您也可以将其存储在文档属性中。不幸的是,这也只需要XML,所以您也将JSON存储为字符串

或者,您是否对转换进行了分析,以查看是否有特定的原因导致其速度减慢如此之多?在转换中使用XSLT和XQuery也会有所不同


json:transform to json有3种算法针对不同目的进行了优化,在灵活性、保真度和性能方面会有不同的折衷。
“basic”(默认值)仅对反向json有用:transform-from-json() “完整”-尽可能保持信息的保真度,在许多情况下交换非“漂亮”格式。 “习惯”-是。。。自定义。。。当json格式是固定的,或者您希望以准确处理XML子集为代价控制json输出时设计

基本和完整是最有效的。然而,所有的变体都相当复杂,需要完全遍历XML节点树并创建一个自底向上的JSON对象树。在ML版本8中,这将被转换为本机JSON节点结构。在REST调用中,它将被序列化为文本

与直接返回xml文档vi fn:doc(“file.xml”)相比,转换案例中涉及的操作至少多了2个数量级。 对于REST调用中仍占总请求时间一小部分的小文档,特别是如果REST调用本身正在执行复杂操作,然后返回一个小结果。您的用例似乎正好相反——返回xml文档直接绕过几乎所有的XQuery处理,直接从内部发送到输出或分配给变量

如果这是一个需要优化的重要用例,尤其是文档可能很大的情况下,那么将它们保存为文本或二进制文件会快得多——这是以使用更多存储为代价的。如果这只是xml的一种变体表示,请尝试将文本JSON存储为二进制,因为它不会产生任何索引开销


否则,如果您需要通过JSON进行查询,那么在ML7中,存储为文本将为您提供简单的word查询,在ML8中,存储为本机JSON将为您提供结构化查询——两者都具有高效的文本序列化功能。

我只是使用JSON:transform to JSON,因为这是一个简单的调用,不需要我做任何工作。时间与需要处理的XML的大小直接相关。我将研究如何在信封中存储各种格式,并了解其工作原理,包括xml完整、xml摘要、json完整和json摘要。是否存储JSON版本最终取决于时间(交付速度)和空间(JSON版本的额外存储)。我认为这方面的选择是1)读时转换(就像你正在做的那样);2) 存储另一个版本(如您所建议的);3) 切换到JSON模型;或者4)在中间层进行转换。我会把(1)或(3)的表现作为我的第一选择。