Groovy 解析 Json 保留键顺序
Groovy parse Json preserve keys order
我尝试在 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]
*/
解决方法如下:
我意识到 readJSON
步骤保持顺序,所以我试着看一下它的实现。
readJSON
使用 net.sf.json.*
库,在这个库中有一个选项可以将字符串解析为 jsonObject(保持键的顺序!)通过:
import net.sf.json.JSONSerializer
def map = JSONSerializer.toJSON(jsonstr)
println(map)
备注:
- 如果你想在管道中使用它,我建议你使用
readJSON
步骤本身,否则,你需要从 Manage Jenkins -> script approval 中批准此功能
- 在此方法中,空属性将为
net.sf.json.JSONNull
它包含一个文本值 "null" -> if (someEmptyKey != null)
always returns true (also when null) 为了避免这种情况,使用:
if (!someEmptyKey instanceof JSONNull )
我尝试在 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]
*/
解决方法如下:
我意识到 readJSON
步骤保持顺序,所以我试着看一下它的实现。
readJSON
使用 net.sf.json.*
库,在这个库中有一个选项可以将字符串解析为 jsonObject(保持键的顺序!)通过:
import net.sf.json.JSONSerializer
def map = JSONSerializer.toJSON(jsonstr)
println(map)
备注:
- 如果你想在管道中使用它,我建议你使用
readJSON
步骤本身,否则,你需要从 Manage Jenkins -> script approval 中批准此功能
- 在此方法中,空属性将为
net.sf.json.JSONNull
它包含一个文本值 "null" ->if (someEmptyKey != null)
always returns true (also when null) 为了避免这种情况,使用:if (!someEmptyKey instanceof JSONNull )