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。两个例子是ResourceExtensionJavascriptResourceExtension

但是,为了回答你的问题,改变这种:

 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,JacksonStreamTestJacksonDatabindTest

+0

非常感谢 - 我会试试。 –

+0

是的,工作!仅供参考 - 我非常接近 - 我曾尝试(除其他之外)是er.getAs(JacksonHandle.class),但这只是一个例外。 –