gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:01:30 26 4
gpt4 key购买 nike

我正在读取一个简单的 JSON....

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

在 Groovy 中使用 JsonSlurper 进入 map ...

Map gradeDistributon = jsonSlurper.parseText(jsonString)

但是当用闭包遍历这个 map 时..

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.

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

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 的 future 版本中改变。

查看我的 blog post了解详情。

关于java - 如何在 Groovy JsonSlurper 中维护 JSON 顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33018236/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com