- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Jenkins 管道上工作时,当我在 net.sf.json.JSONObject
上使用 JsonOutput.toJson()
时,我观察到无限递归导致堆栈溢出> 吞噬了一个包含 null 的 JSON 字符串。
以下最少的代码演示了这个问题:
// Jenkinsfile
@Library('libs@dev') libs
import groovy.json.JsonOutput
pipeline {
agent any
stages {
stage( "json" ) {
steps {
script {
my_lib.to_json_handbuilt_linkedhashmap()
my_lib.to_json_readjson()
my_lib.to_json_readjson_as_linkedhashmap()
}
}
}
}
}
// vars/my_lib.groovy
import groovy.json.JsonOutput
def asMap(j) {
return j as LinkedHashMap
}
// This function is successful.
def to_json_handbuilt_linkedhashmap() {
def d = [:]
d.issues = null
echo "---- handmade LinkedHashMap ----"
echo "d ${d}"
echo "d.getClass() ${d.getClass()}"
echo "JsonOutput.toJson(d) ${JsonOutput.toJson(d)}"
}
// This function fails from infinite recursion causing a stack overflow.
def to_json_readjson() {
def d = readJSON(text: '{ "issues" : null }')
echo "---- readJSON ----"
echo "d ${d}"
echo "d.getClass() ${d.getClass()}"
echo "JsonOutput.toJson(d) ${JsonOutput.toJson(d)}"
}
// This function also fails from infinite recursion causing a stack overflow.
def to_json_readjson_as_linkedhashmap() {
def d = asMap(readJSON(text: '{ "issues" : null }'))
echo "---- readJSON -> asMap ----"
echo "d ${d}"
echo "d.getClass() ${d.getClass()}"
echo "JsonOutput.toJson(d) ${JsonOutput.toJson(d)}"
}
在上面的代码中,当使用 net.sf.json.JSONObject 调用
由 JsonOutput.toJson()
时,to_json_readjson()
失败并出现堆栈溢出readJSON(text: '{ "issues": null }')
返回。Jenkins 控制台输出在本文末尾。
在 to_json_handbuilt_linkedhashmap()
JsonOutput.toJson()
中,使用相当于 { "issues"的手工制作的
.LinkedHashMap
调用时成功: 空
最后,在 to_json_readjson_as_linkedhashmap()
中,JsonOutput.toJson()
在使用从net.sf.json.JSONObject
.
问题:
有人可以解释一下当 readJSON()
和/或 JsonOutput.toJson()
与具有 null 的 JSON 字符串一起使用时导致堆栈溢出的原因吗
?
因为我手工制作的 LinkedHashMap
使用 JsonOutput.toJson()
是成功的,所以我认为问题是传递 JsonOutput.toJson()
net.sf.json.JSONObject
.
但我认为该理论已被排除,因为在 to_json_readjson_as_linkedhashmap()
中,我给 JsonOutput.toJson()
一个 LinkedHashMap
,尽管它是从 net.sf.json.JSONObject
.
问题似乎是我未能掌握的 readJSON()
和/或 JsonOutput.toJson()
的某种组合。
我尝试过,但已经放弃尝试使用 JsonSlurper
,因为 I'm unable to even create an instance of one .
(截断的)堆栈溢出错误可能显示无限递归:
Posting build status of FAILED to bitbucket.company.comjava.lang.StackOverflowError
at java.io.PrintStream.flush(PrintStream.java:338)
at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:297)
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:141)
at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229)
at java.util.logging.StreamHandler.flush(StreamHandler.java:259)
at java.util.logging.ConsoleHandler.publish(ConsoleHandler.java:117)
at java.util.logging.Logger.log(Logger.java:738)
at java.util.logging.Logger.doLog(Logger.java:765)
at java.util.logging.Logger.throwing(Logger.java:1447)
at org.codehaus.groovy.runtime.DefaultGroovyMethods.getProperties(DefaultGroovyMethods.java:391)
at groovy.json.JsonOutput.getObjectProperties(JsonOutput.java:327)
at groovy.json.JsonOutput.writeObject(JsonOutput.java:320)
at groovy.json.JsonOutput.writeMap(JsonOutput.java:458)
at groovy.json.JsonOutput.writeObject(JsonOutput.java:321)
at groovy.json.JsonOutput.writeMap(JsonOutput.java:458)
at groovy.json.JsonOutput.writeObject(JsonOutput.java:321)
at groovy.json.JsonOutput.writeMap(JsonOutput.java:458)
at groovy.json.JsonOutput.writeObject(JsonOutput.java:321)
at groovy.json.JsonOutput.writeMap(JsonOutput.java:458)
at groovy.json.JsonOutput.writeObject(JsonOutput.java:321)
at groovy.json.JsonOutput.writeMap(JsonOutput.java:458)
at groovy.json.JsonOutput.writeObject(JsonOutput.java:321)
at groovy.json.JsonOutput.writeMap(JsonOutput.java:458)
at groovy.json.JsonOutput.writeObject(JsonOutput.java:321)
最佳答案
您能否通过使用 readJSON
的 returnPojo: true
参数来回避这个紧迫的问题,从而更快地解决您的整体任务?
获取普通的旧 null
而不是 net.sf.json.JSONNull 对象今天确实帮助了我,尽管我的问题涉及生成 CSV 而不是使用 JsonOutput。
关于json - Jenkins/groovy : How to pretty-print a net. sf.json.JSONObject 为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71059703/
我是一名优秀的程序员,十分优秀!