2017-03-09 38 views
4

我有一個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; 
    } 

回答

2

首先,讓我建議你只使用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),但這只是一個例外。 –