Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java将mysql层次结构导入JSON对象时出现重复节点_Java_Mysql_Json - Fatal编程技术网

使用Java将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 |

我使用Spring从两个Mysql表中表示的层次结构返回一个JSON对象作为响应

------------    -----------------     
| 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() + "]}";
}