2017-06-22 26 views
5

Bu JSON dosyasını Groovy'de oluşturmalıyım. Başarısız bir şekilde birçok şeyi denedim (JsonOutput.toJson()/JsonSlurper.parseText()).Jenkins Pipeline Groovy json ayrıştırma

{ 
    "attachments":[ 
     { 
     "fallback":"New open task [Urgent]: <http://url_to_task|Test out Slack message attachments>", 
     "pretext":"New open task [Urgent]: <http://url_to_task|Test out Slack message attachments>", 
     "color":"#D00000", 
     "fields":[ 
      { 
       "title":"Notes", 
       "value":"This is much easier than I thought it would be.", 
       "short":false 
      } 
     ] 
     } 
    ] 
} 

Bu, Slack'e bir Jenkins yapı iletisi göndermek içindir.

+0

, ayrıştırma hakkında sorduğunuz soru başlığında ve söz konusu sorunun kendisinde json dosyası oluşturmayı soruyorsunuz. ne istediğini açıklığa kavuşturur musun, yapmaya çalış. – daggett

+0

@daggett Bu JSON nesnesini groovy değişkenine oluşturmak istiyorum. –

cevap

10

JSON, öznitelik değeri çiftleri ve dizi veri türlerinden oluşan veri nesnelerini iletmek için insan tarafından okunabilir metin kullanan bir biçimdir. Yani, genel olarak json biçimlendirilmiş bir metindir.

Yüce json nesnesinde yalnızca bir dizi harita/dizi var.

node{ 
    def data = readJSON file:'message2.json' 
    echo "color: ${data.attachments[0].color}" 
} 

bina json kodundan boru hattı kullanarak json ayrıştırma JsonSlurperClassic

//use JsonSlurperClassic because it produces HashMap that could be serialized by pipeline 
import groovy.json.JsonSlurperClassic 

node{ 
    def json = readFile(file:'message2.json') 
    def data = new JsonSlurperClassic().parseText(json) 
    echo "color: ${data.attachments[0].color}" 
} 

kullanarak json ayrıştırma ve bunu dosyaya yazma

import groovy.json.JsonOutput 
node{ 
    //to create json declare a sequence of maps/arrays in groovy 
    //here is the data according to your sample 
    def data = [ 
     attachments:[ 
      [ 
       fallback: "New open task [Urgent]: <http://url_to_task|Test out Slack message attachments>", 
       pretext : "New open task [Urgent]: <http://url_to_task|Test out Slack message attachments>", 
       color : "#D00000", 
       fields :[ 
        [ 
         title: "Notes", 
         value: "This is much easier than I thought it would be.", 
         short: false 
        ] 
       ] 
      ] 
     ] 
    ] 
    //two alternatives to write 

    //native pipeline step: 
    writeJSON(file: 'message1.json', json: data) 

    //but if writeJSON not supported by your version: 
    //convert maps/arrays to json formatted string 
    def json = JsonOutput.toJson(data) 
    //if you need pretty print (multiline) json 
    json = JsonOutput.prettyPrint(json) 

    //put string into the file: 
    writeFile(file:'message2.json', text: json) 

} 
5

Bir soru yapmaya çalışırken (inandım) basit olmalı, ancak diğer cevap ile ele alınmamışken bu soruyu sordum. JSON'un bir değişkenin içinde bir dize olarak yüklü olması durumunda, onu bir yerel nesneye nasıl dönüştürürsünüz? Açıkçası diğer cevap da anlaşılacağı gibi new JsonSlurperClassic().parseText(json) yapabileceğini, ancak bunu yapmak için Jenkins yerel bir yol var: Bu kimse yardımcı

node() { 
    def myJson = '{"version":"1.0.0"}'; 
    def myObject = readJSON text: myJson; 
    echo myObject.version; 
} 

Umut.

Düzenleme: "Yerel" yorumlarda açıklandığı gibi oldukça doğru değil.

+2

İyi çağrı, bu oldukça doğal olmasa da, [pipeline yardımcı program eklentisi] gerektirir (https://plugins.jenkins.io/pipeline-utility-steps). Kullanmak için mükemmel bir eklenti. [Tam dokümanlar] (https://jenkins.io/doc/pipeline/steps/pipeline-utility-steps/) –

İlgili konular