我有一个MarkLogic XQuery eval调用,它返回一个字符串列表.我使用下面的代码来处理结果.我有另一个调用返回一个Json文档列表,但我看不到如何让EvalResult给我一个JsonDocument文档.如何更改以下代码以处理Json文档?
public static ArrayList<String> getStringList(DatabaseClient client, String query)
{
ArrayList<String> strings = new ArrayList<String>();
ServerEvaluationCall eval = client.newServerEval();
EvalResultIterator eri = eval.xquery(query).eval();
while (eri.hasNext())
{
EvalResult er = eri.next();
String s = er.getString();
strings.add(s);
}
return strings;
}
最佳答案 首先,我建议你只使用eval作为最后的手段,因为它可能会打开一个安全漏洞.如果您从不从客户端发送代码以在服务器上执行,则无法进行注入攻击.首先使用开箱即用的功能,如果这些功能还不够,请考虑编写
resource extension而不是使用eval.两个例子是
ResourceExtension和
JavascriptResourceExtension.
但要回答你的问题,请改变这个:
String s = er.getString();
对此:
JacksonHandle handle = er.get(new JacksonHandle());
JsonNode json = handle.get();
或这个快捷方式:
JsonNode json = er.getAs(JsonNode.class);
有关完整示例,请参阅myArray和myObject EvalTest.evalAndInvokeXQuery(当然还有runAndTestXQuery)和evaltest.xqy的处理.
无论您是从文档读取,搜索还是评估获得JSON结果,这些Jackson句柄的工作方式都相同.您可以阅读有关io快捷方式here的更多信息.有关Jackson的更多示例代码,请参阅JacksonHandleExample,JacksonHandleTest,JacksonStreamTest和JacksonDatabindTest.