Groovy解析Json保留键顺序

vsmadaxz  于 2022-11-01  发布在  其他
关注(0)|答案(1)|浏览(238)

我尝试在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]

* /
gg58donl

gg58donl1#

解决方案如下:我意识到readJSON步骤是保持顺序的,所以我试着看看它的实现。
readJSON使用net.sf.json.*库,在此库中有一个选项,可通过以下方式将字符串解析为jsonObject(并保持键的顺序!):

import  net.sf.json.JSONSerializer

def map = JSONSerializer.toJSON(jsonstr)
println(map)

注:
1.如果您希望在管道中使用它,我建议您使用readJSON步骤本身,否则,您需要从ManageJenkins-〉ScriptApproval中批准此函数
1.在此方法中,空属性将为net.sf.json.JSONNull,它保存文本值“null”-〉if (someEmptyKey != null)始终返回true(也在null时)。为了避免这种情况,请使用:if (!someEmptyKey instanceof JSONNull )
来源:docs,Jenkins-实现

相关问题