我收到了一个基于SON格式的响应,其中n元树的PRENER穿越以JSONArray
给出.我需要将其转换为树 struct 并发送回来作为响应.
给出回应
{
"ControllingArea" : "TZUS",
"TopNodes" : false,
"Language" : "EN",
"TONODES" : [
{
"Groupname" : "INC",
"Hierlevel" : 0,
"Valcount" : 0,
"Descript" : "INC"
},
{
"Groupname" : "INC-BBSR",
"Hierlevel" : 1,
"Valcount" : 0,
"Descript" : "INC1"
},
{
"Groupname" : "INC-STPI",
"Hierlevel" : 2,
"Valcount" : 0,
"Descript" : "INC2"
},
{
"Groupname" : "INC-FORT",
"Hierlevel" : 2,
"Valcount" : 0,
"Descript" : "INC3"
},
{
"Groupname" : "INC-BBL",
"Hierlevel" : 1,
"Valcount" : 0,
"Descript" : "INC4"
},
{
"Groupname" : "INC-PUNE",
"Hierlevel" : 1,
"Valcount" : 0,
"Descript" : "INC5"
}
],
"TOVALUE" : [
{
"Valfrom" : "",
"Valto" : ""
}
]
}
这里的TONODES代表树上的Preorder穿越,也在对象中给出了它所属的级别.
树应该看起来像(UI视图).
我想发送的回复应该是:
{
"INC": {
"Groupname": "INC",
"Hierlevel": 0,
"Valcount": 0,
"Descript": "INC",
"INC-BBSR": {
"Groupname": "INC-BBSR",
"Hierlevel": 1,
"Valcount": 0,
"Descript": "INC1",
"INC-STPI": {
"Groupname": "INC-STPI",
"Hierlevel": 2,
"Valcount": 0,
"Descript": "INC2"
},
"INC-FORT": {
"Groupname": "INC-FORT",
"Hierlevel": 2,
"Valcount": 0,
"Descript": "INC3"
}
},
"INC-BBL": {
"Groupname": "INC-BBL",
"Hierlevel": 1,
"Valcount": 0,
"Descript": "INC4"
},
"INC-PUNE": {
"Groupname": "INC-PUNE",
"Hierlevel": 1,
"Valcount": 0,
"Descript": "INC5"
}
}
}
我try 在网上搜索了很多生成N-Ary树的方法,但没有得到任何满意的结果.因为解决方案说,如果你知道n,u就能够做出树,但我不知道这里的n,因为它可以是随机的.
我还try 在对象的更高层次 struct 即将到来时使用堆栈将 node 插入到其中,并在对象的较低层次 struct 即将到来时弹出.
@Override
public ResponseDTO getTreeStructure(JSONObject sapResponse) {
JSONObject response = new JSONObject();
Stack<JSONObject> treeStack = new Stack<>();
JSONArray iteratingArray = sapResponse.getJSONArray("TONODES");
for(int i = 0 ; i < iteratingArray.length(); i++){
JSONObject tempObject= iteratingArray.getJSONObject(i);
if(treeStack.empty()) {
treeStack.push(tempObject);
response.put(tempObject.getString("Groupname"), tempObject);
}else if(treeStack.peek().getInt("Hierlevel") < tempObject.getInt("Hierlevel")){
response.getJSONObject(treeStack.peek().getString("Groupname")).put(tempObject.getString("Groupname"), tempObject);
treeStack.push(tempObject);
}else if(treeStack.peek().getInt("Hierlevel") >= tempObject.getInt("Hierlevel")){
while(!treeStack.empty() && treeStack.peek().getInt("Hierlevel") >= tempObject.getInt("Hierlevel")){
treeStack.pop();
}
response.getJSONObject(treeStack.peek().getString("Groupname")).put(tempObject.getString("Groupname"), tempObject);
treeStack.push(tempObject);
}
}
return new ResponseDTO(200, "ok", response);
//return null;
}
问题是我无法让之前的对象推入响应.我无法追踪父 node 来获取并到达当前 node 进行推送.
0(N0) -> 1(N1) -> 2(N2)
response.getJSONObject(N0).getJSONObjectI(N1).put(N2.getString("Groupname"), N2);
但相反,在我的方法中,我得到了
response.getJSONObject(N1).put(N2)
I can get the node 1 from the top of the stack, but I cannot track down the parent 0th node to push the 2nd object under 1st.
如果以某种方式可以按照层次 struct 获得之前的 node ,我就能够创建树.
请更正我的代码或告诉我解决这个问题的更好方法.