我尝试在groovy/Jenkins中解析一个Json(我没有访问readJSON
步骤的权限),并保持json键的顺序。
经过我的研究,我发现groovy Map/HashMap
对象没有保持键的顺序,唯一保持顺序的类型是LinkedHashMap
,所以我尝试将JsonSlurper.parseText
的输出转换为linkedhashmap,但它仍然改变了项的顺序
def jsonstr = """
{
"Id": 533,
"StartTime": "2022-05-10 11:56:18",
"EndTime": "2022-05-10 11:58:49",
"TimeShift": "N/A",
"Run": "123",
"Setup": "Test",
"Version": "3.17",
"Result": "pass",
"DebugMode": 1,
"NumberOfCores": 3,
}
"""
//init as LinkedHashMap
LinkedHashMap map = new LinkedHashMap()
map = (LinkedHashMap) (new JsonSlurperClassic().parseText(jsonstr))
println(map)
/*
the output is in incorrect order, I expect to get `Id` attribute as a first key but I'm getting:
[EndTime:2022-05-10 11:58:49, Version:3.17, TimeShift:N/A, StartTime:2022-05-10 11:56:18, DebugMode:1, Run:123, NumberOfCores:3, Id:533, Setup:Test, Result:pass]
* /
1条答案
按热度按时间gg58donl1#
解决方案如下:我意识到
readJSON
步骤是保持顺序的,所以我试着看看它的实现。readJSON
使用net.sf.json.*
库,在此库中有一个选项,可通过以下方式将字符串解析为jsonObject(并保持键的顺序!):注:
1.如果您希望在管道中使用它,我建议您使用
readJSON
步骤本身,否则,您需要从ManageJenkins-〉ScriptApproval中批准此函数1.在此方法中,空属性将为
net.sf.json.JSONNull
,它保存文本值“null”-〉if (someEmptyKey != null)
始终返回true(也在null时)。为了避免这种情况,请使用:if (!someEmptyKey instanceof JSONNull )
来源:docs,Jenkins-实现