将字符串转换为嵌套Json(Java)

将字符串转换为嵌套Json(Java),java,json,spring-boot,Java,Json,Spring Boot,我想要你们大家的指导,我不知道如何在Java+Spring启动的情况下继续下去 我从数据库中收到两列字符串,第一列是一个由斜杠(/)分隔的路径,如“crumps[0]/link/path”,第二列将值分配给第一列,我试图用它创建一个嵌套的JSON 例如,我从数据库中收到以下两列响应,如前所述: COLUMN 1(PATH), COLUMN 2(VALUE) "crumbs[0]/link/path", "/pokemon/type/pokemon?lang=en&q

我想要你们大家的指导,我不知道如何在Java+Spring启动的情况下继续下去

我从数据库中收到两列字符串,第一列是一个由斜杠(/)分隔的路径,如“crumps[0]/link/path”,第二列将值分配给第一列,我试图用它创建一个嵌套的JSON

例如,我从数据库中收到以下两列响应,如前所述:

COLUMN 1(PATH), COLUMN 2(VALUE)
"crumbs[0]/link/path", "/pokemon/type/pokemon?lang=en"
"crumbs[0]/link/wid", "tablePokemon",
"crumbs[0]/name", "Pokemon"
"data/records[1]/id", "Pikachu"
"data/records[1]/link/path": "/pokemon/type/eletric/pikachu",
"data/records[1]/link/wid": "tableEletric",
"data/records[1]/available": "true",
"data/records[2]/id", "Bulbasaur"
"data/records[2]/link/path": "/pokemon/type/grass/bulbasaur",
"data/records[2]/link/wid": "tableGrass",
"data/records[2]/available": "true",
有了这个来自数据库的响应,我试图在Java中得到这个结果:

"crumbs": [
           {
            "link": {
                 "path": "/pokemon/type/pokemon?lang=en",
                 "wid": "tablePokemon"
            },
            "name": "Pokemon"
           }
],
"data": {
         "records": [
                     {
                      "id": "Pikachu",
                      "link": {
                            "path": "/pokemon/type/eletric/pikachu",
                            "wid": "tableEletric"
                      },
                      "available": "true",
                      },
                      {
                       "id": "Bulbasaur",
                       "link": {
                             "path": "/pokemon/type/grass/bulbasaur",
                             "wid": "tableGrass"
                       },
                       "available": "true",
                       }                    
                    ]
}
你们对我实现这个目标有什么建议吗


感谢大家的时间,感谢大家的帮助。

您需要解析路径,然后在内存中构建某种树对象,最后将构建的树转换为JSON

以下是一些提示:

  • 首先定义一个空的根元素。您可以使用
    地图
    。键将是字符串,值将是字符串、列表或映射
  • 对于每个路径,将其拆分为“/”
  • 对于除最后一个之外的每个路径元素,检查它是列表还是子树。您可以通过在字符串末尾出现
    [n]
    来区分这一点
  • 为路径创建除最后一个节点外的所有中间节点。从根(即
    映射
    )开始,为每个元素添加
    列表
    映射
    ,如果该元素在该名称下尚不存在。如果它已经存在,检查它是否是您需要的。如果是
    列表
    ,请附加元素。如果是
    映射
    ,则创建一个子条目
  • 对于最后一个path元素,将其添加为
    字符串
  • 对所有路径重复此操作以填充树
  • 完成后,使用递归和
    StringBuiders
    组合来构造输出字符串。或者,如果只使用字符串、映射和列表,还可以使用Jackson之类的库来生成JSON

请注意,您没有关于列表长度的信息,因此此转换是不可逆的。

您可以使用com.fasterxml.jackson.core.JsonPointer轻松构建JSON

这里提到了解析JsonPath并从中构造Json的一些细节

您可以使用上面引用的代码来构建代码。 将com.fasterxml.jackson依赖项添加到pom.xml

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.11.0</version>
        </dependency>
                <dependency>
            <groupId>org.glassfish</groupId>
            <artifactId>javax.json</artifactId>
            <version>1.1.2</version>
        </dependency>

json数组记录[1]、记录[2]、碎屑[0]将在处理JsonPath后从碎屑[0]/link/path到碎屑/0/link/path进行排序。只需要一些字符串操作就可以了(遍历这些值并用“/0/”替换“[0]”,您可以编写一个正则表达式来匹配和替换模式!)。

Pokemon的复数形式是Pokemon,只是说。
crumbs[0]/link/path
看起来像是与XML而不是JSON一起使用的XPath。你坚持使用JSON的原因是什么?嗨@jurez。是的,它看起来像是与XML一起使用的XPath,原因是a必须以JSON的形式返回API,我很难思考如何做。任何提示都可以。谢谢你,谢谢你@jurez!你的脚步对我帮助很大!嗨,约翰·托马斯,谢谢你的解释,这样做听起来很好!在线上只有一个问题:“ObjectNode rootNode=mapper.createObjectNode();”这个映射器是什么?我试着复制你的例子,它告诉我。再次感谢您的建议和帮助!Jackson ObjectMapper(com.fasterxml.Jackson.databind.ObjectMapper)是使用Jackson解析JSON的最简单方法。ObjectMapper可以解析字符串、流或文件中的JSON,并创建表示已解析JSON的Java对象或对象图。我已经更新了定义了对象映射器的代码。非常感谢您,我将用您的示例继续学习!