{"A":0,"B":0,"C":2,"D":0,"F":5}
在Groovy中使用JsonSlurper进入地图…
@H_502_4@Map gradedistributon = jsonSlurper.parseText(jsonString)
但是当用闭包迭代这个地图时..
@H_502_4@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.
@H_502_4@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.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。