使用Java将mysql层次结构导入JSON对象时出现重复节点
我使用Spring从两个Mysql表中表示的层次结构返回一个JSON对象作为响应使用Java将mysql层次结构导入JSON对象时出现重复节点,java,mysql,json,Java,Mysql,Json,我使用Spring从两个Mysql表中表示的层次结构返回一个JSON对象作为响应 ------------ ----------------- | Concepts | | Relationships | |----------| |---------------| | id | | relation_id | | title | | concept_id_1 | ------------ | concept_id_2 |
------------ -----------------
| Concepts | | Relationships |
|----------| |---------------|
| id | | relation_id |
| title | | concept_id_1 |
------------ | concept_id_2 |
-----------------
为了做到这一点,我有一个方法getChildren
,它返回概念的所有子项
我使用以下方法从mysql中获得层次结构
这一切都从一个已知的概念开始
String test = getPath(concept, children);
我对某些概念的正确回答如下:
{
'id': 160000,
'title': 'root',
'nodes': [{
'id': 160039,
'title': 'Therapeutic Uses',
'nodes': [{
'id': 160001,
'title': 'Anti-Allergic Agents',
'nodes': []
}, {
'id': 160002,
'title': 'Anti-Infective Agents',
'nodes': [{
'id': 160004,
'title': 'Anti-Infective Agents, Local',
'nodes': [{
'id': 160015,
'title': 'Hands Sanitizers',
'nodes': []
}]
}]
}]
}]
}
但是,这段代码将返回以下字符串,其中的节点将被复制,我无法理解为什么会发生这种情况,或者是递归性的哪一部分导致了这个问题
您可以看到此代码返回的答案中重复了概念160039
{
'id': 160000,
'title': 'root',
'nodes': [{
'id': 160039,
'title': 'Therapeutic Uses',
'nodes': [{
'id': 160001,
'title': 'Anti-Allergic Agents',
'nodes': []
}]
}, {
'id': 160039,
'title': 'Therapeutic Uses',
'nodes': [{
'id': 160002,
'title': 'Anti-Infective Agents',
'nodes': [{
'id': 160004,
'title': 'Anti-Infective Agents, Local',
'nodes': [{
'id': 160015,
'title': 'Hands Sanitizers',
'nodes': []
}]
}]
}]
}]
}
我的代码中出现这种情况的原因是什么,如何才能得到正确的响应 写下这个问题后,我注意到我返回了每个父节点的完整字符串,这就是它们重复的原因
将此方法更改为在获取节点的所有其他子字符串后返回字符串,这样我就得到了正确的答案
public String getChildrenString(Concept concept, Set<Concept> children ){
ArrayList<String> returnedStrings = new ArrayList<>();
for (Concept node : children){
String nodeString = getPath(node, hierarchy.getChildrens(node), entity, hierarchy);
returnedStrings.add(nodeString);
}
StringBuilder fullList = new StringBuilder();
for (String s: returnedStrings){
fullList.append(s+"");
}
return "{'id':" + concept.getId() + ","
+ "'title':'" + concept.getDescription() + "'," +
"'nodes':[" + fullList.toString() + "]}";
}
公共字符串getChildrenString(概念,设置子项){
ArrayList returnedStrings=新的ArrayList();
for(概念节点:子节点){
String nodeString=getPath(节点,层次结构。getChildrens(节点),实体,层次结构);
returnedStrings.add(nodeString);
}
StringBuilder fullList=新的StringBuilder();
for(字符串s:返回的字符串){
完整列表。追加(s+“”);
}
返回“{'id':”+concept.getId()+”,“
+“'title':'”+concept.getDescription()+“,”+
“'nodes':[“+fullList.toString()+”]}”;
}
写下这个问题后,我注意到我返回了每个父节点的完整字符串,这就是它们重复的原因
将此方法更改为在获取节点的所有其他子字符串后返回字符串,这样我就得到了正确的答案
public String getChildrenString(Concept concept, Set<Concept> children ){
ArrayList<String> returnedStrings = new ArrayList<>();
for (Concept node : children){
String nodeString = getPath(node, hierarchy.getChildrens(node), entity, hierarchy);
returnedStrings.add(nodeString);
}
StringBuilder fullList = new StringBuilder();
for (String s: returnedStrings){
fullList.append(s+"");
}
return "{'id':" + concept.getId() + ","
+ "'title':'" + concept.getDescription() + "'," +
"'nodes':[" + fullList.toString() + "]}";
}
公共字符串getChildrenString(概念,设置子项){
ArrayList returnedStrings=新的ArrayList();
for(概念节点:子节点){
String nodeString=getPath(节点,层次结构。getChildrens(节点),实体,层次结构);
returnedStrings.add(nodeString);
}
StringBuilder fullList=新的StringBuilder();
for(字符串s:返回的字符串){
完整列表。追加(s+“”);
}
返回“{'id':”+concept.getId()+”,“
+“'title':'”+concept.getDescription()+“,”+
“'nodes':[“+fullList.toString()+”]}”;
}
{
'id': 160000,
'title': 'root',
'nodes': [{
'id': 160039,
'title': 'Therapeutic Uses',
'nodes': [{
'id': 160001,
'title': 'Anti-Allergic Agents',
'nodes': []
}]
}, {
'id': 160039,
'title': 'Therapeutic Uses',
'nodes': [{
'id': 160002,
'title': 'Anti-Infective Agents',
'nodes': [{
'id': 160004,
'title': 'Anti-Infective Agents, Local',
'nodes': [{
'id': 160015,
'title': 'Hands Sanitizers',
'nodes': []
}]
}]
}]
}]
}
public String getChildrenString(Concept concept, Set<Concept> children ){
ArrayList<String> returnedStrings = new ArrayList<>();
for (Concept node : children){
String nodeString = getPath(node, hierarchy.getChildrens(node), entity, hierarchy);
returnedStrings.add(nodeString);
}
StringBuilder fullList = new StringBuilder();
for (String s: returnedStrings){
fullList.append(s+"");
}
return "{'id':" + concept.getId() + ","
+ "'title':'" + concept.getDescription() + "'," +
"'nodes':[" + fullList.toString() + "]}";
}