MarkLogic REST API,JSON和inifinity

时间:2018-04-04 20:11:13

标签: marklogic

我想知道是否有其他人遇到过这个问题以及是否有快速解决方法。似乎是条款" infinity"和" NaN" REST API的JSON解析器不会将其视为字符串,因此包含这些术语的任何查询或结果都会导致错误。

此查询:

/v1/search?q=infinity&format=json

导致此错误:

<error-response xmlns="http://marklogic.com/xdmp/error">
   <status-code>400</status-code>
   <status>Bad Request</status>
   <message-code>XDMP-JSONCHAR</message-code>
   <message>
      XDMP-JSONCHAR: xdmp:unquote("{&quot;snippet-format&quot;:&quot;snippet&quot;,&quot;total&quot...") -- Unexpected character 'I' in JSON at line 1 char 668
   </message>
</error-response>

就我而言,这个词是&#34;无穷大&#34;由代码片段函数突出显示,因此如果它作为元素值单独存在,则JSON解析器会将其解释为数字类型。

我们在MarkLogic Server 8.0-6.4上。我在各种REST API应用程序上尝试了这一点并得到了相同的结果。

1 个答案:

答案 0 :(得分:1)

MarkLogic理解符号Infinity(注意大写字母I)。您可以使用该符号或计算结果值的表达式将JavaScript属性的值设置为此值。当你看它时,你会看到一个字符串“INF”:

let foo =
{
  "bar": Infinity
}

foo

返回

{
  "bar": "INF"
}

关于将此值与其他值进行比较的一些观察结果:

  • foo.bar == "INF":false
  • foo.bar === Infinity:true
  • foo.bar == "Infinity":true(==转换为合适的类型)
  • foo.bar === "Infinity":false(===未转换)

采取下一步,我序列化了一个我测试过的查询,以确保它与上面的测试文档相符:

xdmp.toJsonString(cts.jsonPropertyValueQuery('bar', Infinity))

我把它包裹在{"ctsquery":{}}as noted in the documentation中(尽管不是很容易找到)。然后我尝试了一个REST查询:

http://localhost:8011/v1/search?database=Documents&structuredQuery={"ctsquery":{"jsonPropertyValueQuery":{"property":["bar"],"value":["INF"],"options":["lang=en"]}}}

那不匹配。我相信这是JavaScript对象和JSON(它是JavaScript对象的序列化)之间的区别。

名为“The JSON Data Interchange Syntax”的ECMA标准有这样的说法:

  

“不允许将数字值表示为数字序列(例如Infinity和NaN)”