将字符串转换为嵌套Json(Java)
我想要你们大家的指导,我不知道如何在Java+Spring启动的情况下继续下去 我从数据库中收到两列字符串,第一列是一个由斜杠(/)分隔的路径,如“crumps[0]/link/path”,第二列将值分配给第一列,我试图用它创建一个嵌套的JSON 例如,我从数据库中收到以下两列响应,如前所述:将字符串转换为嵌套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
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元素,将其添加为
字符串
- 对所有路径重复此操作以填充树
- 完成后,使用递归和
组合来构造输出字符串。或者,如果只使用字符串、映射和列表,还可以使用Jackson之类的库来生成JSONStringBuiders
请注意,您没有关于列表长度的信息,因此此转换是不可逆的。您可以使用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对象或对象图。我已经更新了定义了对象映射器的代码。非常感谢您,我将用您的示例继续学习!