首页 > 解决方案 > 是否存在提供任意深度嵌套以转换为 JSON 对象的 Java 类?

问题描述

我怀疑一定有一些我忽略的 Java 类或库提供了我正在寻找的功能:

我的 Select Input 内容可能会变得非常大,我想分层显示它们以提高可读性(参见下面的示例)。嵌套可以实现任意深度。

Weapons
  Swords
    1-handed
      Katanas
      Bokin
    2-handed
      Zweihänder
  Spears
    Angon
Food
  Meat
    Fish
      Angel
  Pasta
...

我没有使用,OptGroup因为我需要这些集合本身是可选择的。首先,我在网上搜索了一个 Java 树类的引用。没有找到任何东西,我在服务器端递归地将我的选项的数据收集到 HashMap 的 HashMap 的 HashMap 中,一直向下,然后调用new Gson().toJson(data). 在客户端,我通过在每个值上调用键来递归遍历它,填充文本以匹配深度。这工作了一段时间,直到我意识到我需要我的选项值与选项文本不同。现在我又不知所措了,因为该HashMap系列看起来无法处理这个额外的维度。

我以前没有尝试过手动编写 JSON,但我认为我现在要发送的 JSON 可能看起来像这样:

{
   'name' : 'Weapons',
   'id' : 45,
   {
      'name' : 'Swords',
      'id' : 32,
      {
        'name' : '1-handed',
        'id' : 341,
        {
          'name' : 'Katanas',
          'id' : 3
        },
        {
          'name' : 'Bokin',
          'id' : 9
        }
      }
   }
}

减去现有的解决方案,我认为我的下一个计划是创建一个存储自己的选项数据的类以及该类的实例数组。在解决方案的深层次上,也许我可以学习如何正确格式化 JSON 并使用 StringBuilder 和递归来构造 JSON 对象。但是,对于这个问题,难道没有利用现成库的解决方案吗?

标签: javajsonformscollectionstree

解决方案


你在正确的轨道上Map<String, Object>,因为它可以嵌套任意深。

但是,您需要命名嵌套节点的列表,例如调用它children,但您当然可以随意命名:

{
    "name": "Weapons",
    "id": 45,
    "children": [{
        "name": "Swords",
        "id": 32,
        "children": [{
            "name": "1-handed",
            "id": 341,
            "children": [{
                "name": "Katanas",
                "id": 3
            }, {
                "name": "Bokin",
                "id": 9
            }]
        }]
    }]
}

但是在 Java 中,更好的方法是使用类型安全的对象,而不是普通的映射:

class Node {
    private String name;
    private int id;
    private List<Node> children;

    // constructor, getters and setters here
}

推荐阅读