【问题标题】:MarkLogic REST API, JSON and inifinityMarkLogic REST API、JSON 和无穷大
【发布时间】:2018-04-04 20:11:12
【问题描述】:

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

这个查询:

/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>

在我的例子中,“无穷大”这个词被 sn-p 函数突出显示,所以如果它作为一个元素值单独存在,JSON 解析器会将其解释为数字类型。

我们使用的是 MarkLogic Server 8.0-6.4。我已在各种 REST API 应用程序上尝试过此操作并获得相同的结果。

【问题讨论】:

    标签: marklogic


    【解决方案1】:

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

    let foo =
    {
      "bar": Infinity
    }
    
    foo
    

    返回

    {
      "bar": "INF"
    }
    

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

    • foo.bar == "INF": 错误
    • foo.bar === Infinity:是的
    • 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)”

    【讨论】:

    • 谢谢戴夫。原来这是一个在版本 9 中修复的已知错误。
    猜你喜欢
    • 1970-01-01
    • 2016-04-30
    • 2022-08-12
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 2017-08-19
    • 2022-08-12
    相关资源
    最近更新 更多