2016-09-17 22 views
0
使用JsonOutput

我的Groovy腳本是創建一個JSON文件看起來像這樣JSON文件中的元素:不必要的報價加入到Groovy中

JSON output

有是進入HSP的數組元素的可變數目。基本上,我的輸出是正確的,但腳本添加了不必要的引號給元素。相關代碼如下所示:

foundPlasmids.each { 
    def tempHSPs = [] 
    it.hsps.each{ 
     def hsps = JsonOutput.toJson(
      [bit_score: it.bit_score, 
      evalue: it.evalue, 
      score: it.score, 
      query_from: it.query_from, 
      query_to: it.query_to, 
      hit_from: it.hit_from, 
      hit_to: it.hit_to, 
      align_len: it.align_len, 
      gaps: it.gaps] 
     ) 
     tempHSPs << JsonOutput.prettyPrint(hsps) 
    } 

    def output = JsonOutput.toJson(
     [contig: it.contig, title: it.title, accNumber: it.accession, length: it.length, noHSPs: it.noHsps, hsps: tempHSPs] 
    ) 

    prettyOutput << JsonOutput.prettyPrint(output) 
} 

foundPlasmids是包含所有包括hsps陣列中信息的哈希。 I prettyPrint全部hsps排列爲tempHSPs並且通過tempHSPsoutput。我無法弄清楚爲什麼增加了額外的引號,並且想不到將hsps陣列傳遞到output的不同方法。 謝謝你的幫助。

回答

0

要放入tempHSP數組中的對象是JSON的字符串表示形式,它們由prettyPrint函數生成。 JsonOutput中的所有toJson函數都返回字符串,而prettyPrint接受一個字符串,對其進行格式化並返回一個字符串。

你在做什麼不是放入tempHSPs是一個實際的JSON對象或數組。您正在放入一個字符串,因此最終輸出包含每個頂級元素中包含單個字符串值的數組「hsps」。

這有兩個問題。

其中之一是字符串不被def output = JsonOutput.toJson的調用正確轉義,我只能假設它是JsonOutput類中的一個錯誤?這似乎不太可能,但我沒有更好的解釋。它看起來更像是...

[ 
    { 
     "nohsps": 1, 
     "hsps": [ 
      "{\r\n \"bit_score\": 841.346,\r\n \"evalue\": 0,\r\n (and so on)\r\n}" 
     ] 
    }, 
    { 
     "nohsps": 6, 
     "hsps": [ 
      "{\r\n \"bit_score\": 767.48,\r\n \"evalue\": 0,\r\n (and so on)\r\n}" 
     ] 
    } 
] 

的第二個問題是,它聽起來就像你不想字符串,而是希望JSON對象,所以才停止轉動你的Groovy對象轉換成字符串......

def tempHSPs = [] 
it.hsps.each{ 
    def hsps = 
     [bit_score: it.bit_score, 
     evalue: it.evalue, 
     score: it.score, 
     query_from: it.query_from, 
     query_to: it.query_to, 
     hit_from: it.hit_from, 
     hit_to: it.hit_to, 
     align_len: it.align_len, 
     gaps: it.gaps] 
    ) 
    tempHSPs << hsps 
} 

,如果你想簡化它,刪除所有的東西有關tempHSPs,讓JSONObject的自動序列化他們,看看它會自動出現:

def output = JsonOutput.toJson(
     [contig: it.contig, title: it.title, accNumber: it.accession, length: it.length, noHSPs: it.noHsps, hsps: foundPlasmids*.hsps ] 
    ) 

(我還沒有驗證過這個語法; )

如果它窒息在hsps對象上,或者你不喜歡結果輸出(例如,如果你想刪除或重命名一些屬性)恢復使你的地圖像你一樣,現在重新做。