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

时间:2016-06-10 02:11:38

标签: json xml marklogic marklogic-8

我正在使用信封模式,我的规范模型部分是XML格式。我通常会全部或以摘要版本返回模型。检索文档非常快,但是当我作为REST调用的一部分返回时,我需要将JSON返回给浏览器,我的json:transform-to-json需要将返回XML的调用版本加倍。

是一种策略,也可以在信封中使用JSON格式的规范模型,或者可能在信封外的其他文档中以完整格式和摘要格式呈现json,但这些格式不会被搜索,但是主要用于返回结果?通过这种方式,我不必为了将规范模型一直转换为JSON而受到重创。

还有其他方法吗?

2 个答案:

答案 0 :(得分:2)

从XML到JSON的转换应该相对较轻,但仅仅需要做一些事情就需要花费很多。提前完成这项工作肯定会节省时间。您可以将两种格式放在同一个封装中(虽然JSON必须以字符串形式存储),或者在您建议的其他文档中存储。或者,您也可以将其存储在文档属性中。不幸的是,这也只需要XML,所以你也将JSON作为字符串存储在那里。

或者,你有没有对变换进行分析,看看是否有一个特殊原因导致它如此减速?使用XSLT与XQuery进行转换也可能有所不同。

HTH!

答案 1 :(得分:1)

json:transform-to-json有3种针对不同目的而优化的算法,并且具有灵活性,保真度和性能的不同权衡。
“basic”(默认)仅用于反转json:transform-from-json() “完整” - 尽可能保留信息保真度,以换取非“prety”格式在许多情况下。 “自定义” - 是...自定义...在修复json格式时或者您希望控制json输出时设计,但代价是准确处理XML子集。

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

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

如果这是一个重要的用例来优化,特别是如果文档可能很大,那么将它们保存为文本或二进制文件将会快得多 - 以牺牲更多的存储空间为代价。如果这只是xml的变体表示,请尝试将文本JSON存储为二进制文件,因为它不会产生任何索引开销。

否则,如果您需要查询JSON,那么在ML7中存储为文本可以为您提供简单的单词查询,在ML8中存储为本机JSON可以为您提供结构化查询 - 两者都具有高效的文本序列化。