【问题标题】:Java- Set Interface - Parse JSON String in orderJava-Set 接口 - 按顺序解析 JSON 字符串
【发布时间】:2024-01-11 03:19:01
【问题描述】:

我有 Spring MVC 应用程序。

我有以下从客户端发送的 JSON 字符串

{
  "cfgName": "Name",
  "cfgfieldses": [
    {
      "cfgsName": "form.0",
      "cfgValue": "someVal"
    },
    {
      "cfgsName": "form.2",
      "cfgValue": "hello"
    },
    {
      "cfgsName": "form.3",
      "cfgValue": "fname"
    },
    {
      "cfgsName": "form.1",
      "cfgValue": "how?"
    }
  ]
}

我有两个类来解析这个

Config.java

public class Config implements Serializable {
    private String cfgName;
    private Set<CfgFields> cfgFieldses = new HashSet<CfgFields>(0);

    //getters and setters
}

CfgFields.java

public class CfgFields implements Serializable {
    private String cfgsName;
    private String cfgValue;

    //getters and setters
}

这是我的控制器

public void saveConfig(@RequestBody Config config) {
    System.out.println(config.getCfgName());
    for (Cfgfields cfgfields: config.getCfgFieldses()) {
        System.out.println(cfgfields.getCfgsName());
    }
}

cfgfieldses 不是我得到的,因为它是Set。这就是我得到的输出。

Name
form.1
form.2
form.0
form.3

当我从客户端发送 JSON 字符串时,我想以有序的方式进行操作。我可以尝试 List 而不是 Set。但我想知道是否有可能使用Set 并以有序的方式进入。

我的预期输出是

Name
form.0
form.2
form.3
form.1

【问题讨论】:

  • LinkedHashSet 代替 hashset? (LinkedHashSet保持插入顺序)
  • 如果您想要订单顺序,您需要使用列表。
  • @chillworld 我已经尝试过LinkedHashSet。但它也不起作用
  • 与列表你有同样的问题(和顺序)? (那么它可能是 xml 的解析器)
  • 我没有尝试过列表。我试图在没有 List 的情况下使用它以避免重复。在其他程序中,我尝试使用 LinkedHashSet 将 List 转换为 Set,它对我来说效果很好。但是在控制器中 JSON 没有按顺序设置。我不知道为什么

标签: java json spring-mvc set


【解决方案1】:

不要使用HashSet,而是使用LinkedHashSet

与不保证其项目顺序的HashSet 不同,LinkedHashSet 允许您按照插入顺序对其成员进行迭代。

编辑

如果您想对 Set 中的项目强制执行特定排序顺序(例如,按表单名称),请使用 SortedSet,例如 TreeSet。您需要为您的 Cfgfields 类提供自定义 Comparator

【讨论】:

  • 如何根据即将到来的顺序创建自定义比较器?
  • 如果您希望项目按照阅读顺序出现,LinkedHashSet 就足够了(当然,这假设它们是按照阅读顺序添加的)
  • 但它不适用于 JSON 字符串。你能看一下我在提问后添加的评论吗?
  • 您使用的是哪个 JSON 解析器?
  • 你能把初始化和调用解析器的代码贴出来吗?