我想知道是否有其他人遇到过这个问题以及是否有快速解决方法。似乎是条款" 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("{"snippet-format":"snippet","total"...") -- Unexpected character 'I' in JSON at line 1 char 668
</message>
</error-response>
就我而言,这个词是&#34;无穷大&#34;由代码片段函数突出显示,因此如果它作为元素值单独存在,则JSON解析器会将其解释为数字类型。
我们在MarkLogic Server 8.0-6.4上。我在各种REST API应用程序上尝试了这一点并得到了相同的结果。
答案 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)”