使用Java

时间:2016-07-30 01:04:30

标签: java mysql json

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

------------    -----------------     
| Concepts |    | Relationships |
|----------|    |---------------|
| id       |    | relation_id   |
| title    |    | concept_id_1  |
------------    | concept_id_2  |
                -----------------

为了做到这一点,我使用方法getChildren返回concept的所有子项。

我使用以下方法从mysql获取层次结构。

public String getPath(Concept concept, Set<Concept> children){
    if (children.size() > 0){

        Set<Concept> newNodes = new HashSet<>();
        ArrayList<String> returnedStrings = new ArrayList<>();
        String currentString = getChildrenString(concept, children);
        return currentString;
    }
    return getMainString(concept, "");
}
public String getChildrenString(Concept concept, Set<Concept> children){
    ArrayList<String> returnedStrings = new ArrayList<>();
    for (Concept node : children){
        String currentString = "{'id':" + concept.getId() + ","
                                + "'title':'" + concept.getDescription() + "',"
                                + "'nodes':[" + getPath(node, getChildrens(node)) + "]}";
        returnedStrings.add(currentString);
    }
    StringBuilder fullList = new StringBuilder();
    for (String s: returnedStrings){
        fullList.append(s+"");
    }
    return fullList.toString();
}
public String getEmptyString(Concept concept){

    return "{'id':"+ concept.getId() + ","
            + "'title':'" + concept.getDescription() + "',"
            + "'nodes': []}";
}

这一切都从一个已知的概念开始。

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': []
                }]
            }]
        }]
    }]
}

在我的代码中可能是什么原因,我怎样才能得到正确的答案?

1 个答案:

答案 0 :(得分:0)

在写完这个问题后,我注意到我正在为每个节点返回完整的字符串,这就是他们重复的原因。

更改此方法以在获取节点的所有其他子字符串后返回字符串,为我提供正确的答案。

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