このJSONファイルをGroovyで作成する必要があります。いろいろ試してみました(JsonOutput.toJson()
/JsonSlurper.parseText()
)が失敗しました。
{
"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
}
]
}
]
}
これは、JenkinsビルドメッセージをSlackに投稿するためのものです。
JSON は、人間が読み取れるテキストを使用して、属性と値のペアと配列データ型で構成されるデータオブジェクトを送信する形式です。そのため、一般的にjsonはフォーマットされたテキストです。
Groovyでは、jsonオブジェクトは単なるマップ/配列のシーケンスです。
JsonSlurperClassicを使用したJSONの解析
//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}"
}
パイプラインを使用してJSONを解析する
node{
def data = readJSON file:'message2.json'
echo "color: ${data.attachments[0].color}"
}
コードからjsonを構築し、ファイルに書き込みます
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)
}
私が何かをしようとしていたときにこの質問を見つけました(私は信じていました)は簡単にするべきですが、他の答えでは対処されませんでした。 JSONを変数内の文字列としてロード済みの場合、ネイティブオブジェクトに変換するにはどうすればよいですか?明らかに、他の答えが示唆するようにnew JsonSlurperClassic().parseText(json)
を実行できますが、Jenkinsにはこれを行うネイティブな方法があります:
node () {
def myJson = '{"version":"1.0.0"}';
def myObject = readJSON text: myJson;
echo myObject.version;
}
これが誰かを助けることを願っています。
編集:コメントで説明したように、「ネイティブ」はあまり正確ではありません。
ホワイトリストに登録されたクラス/メソッドを追加できない可能性があるサンドボックスとJenkins Script Securityプラグインを使用したインストールにこだわっている場合、私が見つけた唯一の方法は次のとおりです。
def slackSendOnRestrictedContext(params) {
if (params.attachments != null) {
// Soooo ugly but no other choice with restrictions of Jenkins Script Pipeline Security plugin ^^
def paramsAsJson = JsonOutput.toJson(params)
def paramsAsJsonFromReadJson = readJSON text: paramsAsJson
params.attachments = paramsAsJsonFromReadJson.attachments.toString()
}
slackSend (params)
}
これにより、jsonFileファイルから「バージョン」の値が返されます。
def getVersion(jsonFile){
def fileContent = readFile "${jsonFile}"
Map jsonContent = (Map) new JsonSlurper().parseText(fileContent)
version = jsonContent.get("version")
return version
}