首页 > 解决方案 > 解析后对 Groovy 扁平化的 JsonSluper 对象进行排序

问题描述

我有一条 JSON 消息,在使用 JsonSluper 解析它之后,排序被搞砸了。我知道排序并不重要,但是在消息被解析并扁平化为单个对象后,我需要将消息放回升序,因此我可以构建一个 JsonArray 并以正确的 asc 顺序显示消息。

String test = """[
{
"AF": "test1",
"BE": "test2",
"CD": "test3",
"DC": "test4",
"EB": "test5",
"FA": "test5"
},
{
"AF": "test1",
"BE": "test2",
"CD": "test3",
"DC": "test4",
"EB": "test5",
"FA": "test5"
}
]"""

parseText 产生这个:

def json = new groovy.json.JsonSlurper().parseText(test);

[{CD=test3, BE=test2, AF=test1, FA=test5, EB=test5, DC=test4}, {CD=test3,
 BE=test2, AF=test1, FA=test5, EB=test5, DC=test4}]

解析 json 消息后,我需要将 flatten json 对象传递给一个方法,在该方法中,在添加到如下所示的 JSONArray 之前,需要按映射键按升序排序。

def json = new groovy.json.JsonSlurper().parseText(test);
for( int c = 0; c < json?.size(); c++ )
    doSomething(json[c]);

void doSomething( Object json ){
    def jSort= json.????
    JSONArray jsonArray = new JSONArray();
    jsonArray.add(jSort);
}

​</p>

标签: javajsongroovy

解决方案


您可以在添加条目之前对条目进行排序。以下用途collectEntries,它创建LinkedHashMap对象(从而保持顺序):

def json = new groovy.json.JsonSlurper().parseText(test);

def sortedJson = json.collect{map -> map.entrySet().sort{it.key}
                     .collectEntries{[it.key, it.value]}}

sortedJson有这个内容,好像是按要求排序的:

 [[AF:test1, BE:test2, CD:test3, DC:test4, EB:test5, FA:test5], 
  [AF:test1, BE:test2, CD:test3, DC:test4, EB:test5, FA:test5]]

推荐阅读