# Jenkins Map to JSON stackOverflowError ## 問題起源 要透過Jekins處理K8s的部屬,想想我們有Rancher,那就從Rancher的API取得內容,修改後再Update上去就好 一開始會使用Jenkins的插件httpRequest取得內容,再用Pipeline Utility轉換成Map,Map修改後要轉成Json才能發Request,於是又使用了`groovy.json.JsonOutput.toJson`,就在這個時候錯誤發生了,因為從Rancher取得的資料裡面有null ### Pipeline Utility Jenkins裡面的一個插件,讓你在Pipeline裡面可以解析Json - JSON to Map ``` groovy def responseMap = readJSON text: response.content ``` 轉換後資料型態會是`LinkedHashMap`,而在這裡面的`null`資料型態會是`net.sf.json.JSONNull`,一般的`null`則是`org.codehaus.groovy.runtime.NullObject` ### groovy.json.JsonOutput.toJson 很方便,可以把Map轉換成JSON的Method ```groovy groovy.json.JsonOutput.toJson(responseMap) ``` 但是有個問題,遇到`net.sf.json.JSONNull`就會瘋狂loop直到拋出錯誤 - 錯誤訊息 ``` groovy java.lang.StackOverflowError at java.base/java.util.HashMap.putVal(HashMap.java:627) at java.base/java.util.HashMap.put(HashMap.java:610) at org.codehaus.groovy.runtime.DefaultGroovyMethods.getProperties(DefaultGroovyMethods.java:474) at groovy.json.JsonOutput.getObjectProperties(JsonOutput.java:338) at groovy.json.JsonOutput.writeObject(JsonOutput.java:331) at groovy.json.JsonOutput.writeMap(JsonOutput.java:469) at groovy.json.JsonOutput.writeObject(JsonOutput.java:332) at groovy.json.JsonOutput.writeMap(JsonOutput.java:469) at groovy.json.JsonOutput.writeObject(JsonOutput.java:332) ``` ## 解決方法 如果要繼續使用這兩個插件又不想去推PR的話,那就自幹把`net.sf.json.JSONNull`轉換成`org.codehaus.groovy.runtime.NullObject` ``` groovy def filterNull(obj){ if (obj instanceof Map){ obj.each { key, value -> if (value.toString() == "null"){ obj[key] = null } else if (value instanceof List){ value.eachWithIndex { item, index -> if (item.toString() == "null"){ filterNull(item) } else if (item instanceof Map){ filterNull(item) } } } } }else if (obj instanceof List){ obj.eachWithIndex { item, index -> if (item.toString() == "null"){ obj[item] = null } else if (item instanceof Map){ filterNull(item) } } }else{ if (obj.toString() == "null"){ obj = null } } return obj } ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up