如何在Groovy的JsonSlurper中维护JSON的顺序?

Abu*_*iam 5 java groovy json

我正在阅读一个简单的JSON...。

{"A":0,"B":0,"C":2,"D":0,"F":5}
Run Code Online (Sandbox Code Playgroud)

在Groovy中使用JsonSlurper进入地图...

Map gradeDistributon = jsonSlurper.parseText(jsonString)
Run Code Online (Sandbox Code Playgroud)

但是当使用闭包遍历此地图时。

gradeDistributon.each{ entry ->   
     println "From map got key ${entry.key}"
Run Code Online (Sandbox Code Playgroud)

我看到密钥的顺序不是原始JSON中的顺序,例如“ C”排在最前面。我认为这是因为Map不维护Java中的插入顺序。有没有办法保持原始JSON的顺序?

如果这意味着以其他方式(而不是使用JsonSlurper映射到JSON)读取JSON,那么如果您可以向我展示如何使用它,那我很好。

Giu*_*ero 1

我无法使用 groovy 2.4.5 重现您的行为,但您可以尝试使用 LinkedHashMap (允许迭代映射键以保持条目插入的顺序):

import groovy.json.*

def jsonText = '''
{"A":0,"B":0,"C":2,"D":0,"F":5,"G":7,"H":9}
'''

LinkedHashMap json = new JsonSlurper().parseText(jsonText)
json.each{ entry ->
  println "${entry.key}"
}
Run Code Online (Sandbox Code Playgroud)

注意:正如@XenoN所述,JsonSlurper()在解析过程中对json键进行排序,因此与输入顺序无关(即{"H":0,"B":0,"A":2,"D":0,"G":5,"F":7,"C":9}),JsonSlurper的输出将始终是:{"A":2,"B":0,"C":9,"D":0,"F":7,"G":5,"H":0}

使用LinkedHashMap而不是 HashMap,我们保留 JsonSlurper 给出的顺序。