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)

备注:

  1. 如果你想在管道中使用它,我建议你使用 readJSON 步骤本身,否则,你需要从 Manage Jenkins -> script approval
  2. 中批准此功能
  3. 在此方法中,空属性将为 net.sf.json.JSONNull 它包含一个文本值 "null" -> if (someEmptyKey != null) always returns true (also when null) 为了避免这种情况,使用: if (!someEmptyKey instanceof JSONNull )

来源:docs, jenkins-implementation