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

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

{"A":0,"B":0,"C":2,"D":0,"F":5}

在Groovy中使用JsonSlurper进入地图…

Map gradeDistributon = jsonSlurper.parseText(jsonString)

但是当用闭包迭代这个地图时..

gradeDistributon.each{ entry ->   
     println "From map got key ${entry.key}"

我看到键不符合原始JSON中的顺序,例如’C’首先出现.我认为这是因为Map不能在Java中维护插入顺序.有没有办法保持原始JSON的顺序?

如果它意味着以不同的方式读取JSON(而不是使用JsonSlurper的Map),那么如果你能告诉我如何,那我很好.

解决方法:

您可以设置JVM系统属性jdk.map.althashing.threshold,以使JsonSlurper使用LinkedHashMap而不是TreeMap作为内部Map实现,例如, -Djdk.map.althashing.threshold = 512.

原因是JsonSlurper使用的groovy.json.internal.LazyMap的source code.

private static final String JDK_MAP_ALTHASHING_SYSPROP = System.getProperty("jdk.map.althashing.threshold");

private void buildIfNeeded() {  
    if (map == null) {
        /** added to avoid hash collision attack. */
        if (Sys.is1_7OrLater() && JDK_MAP_ALTHASHING_SYSPROP != null) {
            map = new LinkedHashMap<String, Object>(size, 0.01f);
        } else {
            map = new TreeMap<String, Object>();
        }
    }
}

请注意,此解决方案应该用作hack,因为它取决于Groovy的内部实现细节.所以这种行为可能会在未来的Groovy版本中发生变化.

有关详情,请参阅我的blog post.

相关文章

背景:    8月29日,凌晨4点左右,某服务告警,其中一个...
https://support.smartbear.comeadyapi/docs/soapui/steps/g...
有几个选项可用于执行自定义JMeter脚本并扩展基线JMeter功能...
Scala和Java为静态语言,Groovy为动态语言Scala:函数式编程,...
出处:https://www.jianshu.com/p/ce6f8a1f66f4一、一些内部...
在运行groovy的junit方法时,报了这个错误:java.lang.Excep...