Java - 处理给予JSON文档的Marklogic评估响应
问题描述:
我有一个MarkLogic XQuery eval调用,它返回一个字符串列表。我使用下面的代码来处理结果。我有另一个调用返回一个Json文档列表,但我看不到如何让EvalResult给我一个JsonDocument文档。如何更改下面的代码来处理Json文档?Java - 处理给予JSON文档的Marklogic评估响应
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。
无论您是从文档读取,搜索还是eval获取JSON结果,这些Jackson处理工作都是一样的。你可以阅读更多关于io快捷方式here。有关Jackson的更多示例代码,请参阅JacksonHandleExample,JacksonHandleTest,JacksonStreamTest和JacksonDatabindTest。
非常感谢 - 我会试试。 –
是的,工作!仅供参考 - 我非常接近 - 我曾尝试(除其他之外)是er.getAs(JacksonHandle.class),但这只是一个例外。 –