gpt4 book ai didi

java - 从多层ObjectNode中检索线结构

转载 作者:太空宇宙 更新时间:2023-11-04 14:34:33 24 4
gpt4 key购买 nike

我有一个ObjectNode作为输入参数,我不知道该节点的确切结构。我的意思是它内部可以有任意数量的层,从非常简单的 NameValuePair<String,String> 数组开始。复杂的结构,如 HashMap<String,Object> 。我如何将它解析为简单的平面结构,如 NameValuePair<String,String> 数组?我之前为 ObjectNodes 做过这件事具有已知的结构,但现在我不知道。

我感谢任何帮助和想法。

添加详细信息:例如,如果我知道,在 ObjectNode 中我总是会找到 HashMap<String,String> ,仅此而已,我能做的就是:

ObjectNode parametersNode = (ObjectNode) request.get("parameters");
Iterator fieldNames = parametersNode.getFieldNames();
HashMap<String,String> oldParams = new HashMap<String,String>();

while (fieldNames.hasNext()) {
String name = (String) fieldNames.next();
oldParams.put(name, parametersNode.get(name).asText());
}

但是如果这个 ObjectNode 的结构有点像黑盒子呢?我不知道是否有一个Map,或者一个Array,或者一个Map里面有一堆Map。它可能来自不同的来源,而且我不知道我随时会得到什么结构。它可以是:

{
"name":"value",
"name1":"value1"
}

{
"name":"value",
"arg1": [
"name1":"value1",
"name1":"value1"
]
}

{
"name":"value",
"arg1": [
{"name1":"value1"},
{"name1":"value1"}
]
}

或任何更复杂的结构。我事先没有任何信息,我得到了什么。如何将这样的黑盒 ObjectNode 转换为名称-值对的平面数组?有没有通用的算法?

最后,无论初始结构的复杂性如何,我都应该得到这样的简单结构:

{
"name":"value",
"name1":"value1",
"name2":"value2"
}

最佳答案

由于我没有得到答案,所以我自己做了。对于那些面临同样问题的人,我将其发布在这里。它没有任何递归,我在不应该使用的地方使用了 HashMap,但它是作为概念证明并打算进行重构。请注意,它是通过 Postman 在 Switchyard 上作为 Web 服务进行测试的,因此没有 main 方法。

public ArrayList<HashMap<String, String>> convertToFlatFormat(
JsonNode request) {
Stack<Pair> stack = new Stack<Pair>();
ArrayList<HashMap<String, String>> parametersList = new ArrayList<HashMap<String, String>>();
stack.push(new Pair("", request));
HashMap<String, Integer> counts = new HashMap<String, Integer>();
while (!stack.isEmpty()) {
Pair higherNodePair = stack.pop();
String nodeName = higherNodePair.name;
JsonNode higherNode = (JsonNode) higherNodePair.object;
String newNamePrefix = "";
if (higherNode.isArray()) {
ArrayNode higherArrayNode = (ArrayNode) higherNode;
for (int i = 0; i < higherNode.size(); i++) {
JsonNode node = higherArrayNode.get(i);
String key = new Integer(i).toString();
if (node.isObject()) {
if (nodeName.equals("")) {
stack.push(new Pair(newNamePrefix, node));
} else {
stack.push(new Pair(nodeName + "_" + newNamePrefix
, node));
}
} else if (node.isArray()) {
if (nodeName.equals("")) {
stack.push(new Pair(newNamePrefix, node));
} else {
stack.push(new Pair(nodeName + "_" + newNamePrefix
, node));
}
} else if (node.isValueNode()) {
ValueNode valueNode = (ValueNode) node;
String value = valueNode.getTextValue();
HashMap<String, String> pair = null;
if (nodeName.equals("")) {
pair = new HashMap<String, String>();
pair.put(newNamePrefix + key, value);
} else {
pair = new HashMap<String, String>();
pair.put(nodeName + "_" + newNamePrefix + key,
value);
}
parametersList.add(pair);
}
}

} else {
Iterator<String> iterate = higherNode.getFieldNames();
while (iterate.hasNext()) {
String key = iterate.next();
JsonNode node = higherNode.get(key);
if (node.isObject()) {
if (nodeName.equals("")) {
stack.push(new Pair(newNamePrefix + key, node));
} else {
stack.push(new Pair(nodeName + "_" + newNamePrefix
+ key, node));
}
} else if (node.isArray()) {
if (nodeName.equals("")) {
stack.push(new Pair(newNamePrefix + key, node));
} else {
stack.push(new Pair(nodeName + "_" + newNamePrefix
+ key, node));
}
} else if (node.isValueNode()) {
ValueNode valueNode = (ValueNode) node;
String value = valueNode.getTextValue();
HashMap<String, String> pair = null;
if (nodeName.equals("")) {
pair = new HashMap<String, String>();
pair.put(newNamePrefix + key, value);
} else {
pair = new HashMap<String, String>();
pair.put(nodeName + "_" + newNamePrefix + key,
value);
}
parametersList.add(pair);
}
}
}
}
return parametersList;
}

private class Pair {
public String name;
public Object object;

public Pair(String name, Object object) {
this.name = name;
this.object = object;
}
}

输入是:

{
"name1":"value1",
"name2":"value2",
"name3":[
{
"ComponentId":"qwer",
"InstanceId":"amba"
},
{
"ComponentId":"qwer",
"InstanceId":"coramba"
},
{
"ComponentId":"dsa",
"InstanceId":"badar"
},
{
"ComponentId":"dsa",
"InstanceId":"fdarr"
},
{
"ComponentId":"dsa",
"InstanceId":"sdddd"
}
]
}

输出为:

[
{
"name1": "value1"
},
{
"name2": "value2"
},
{
"name3__dsa_1_ComponentId": "dsa"
},
{
"name3__dsa_1_InstanceId": "sdddd"
},
{
"name3__dsa_2_ComponentId": "dsa"
},
{
"name3__dsa_2_InstanceId": "fdarr"
},
{
"name3__dsa_3_ComponentId": "dsa"
},
{
"name3__dsa_3_InstanceId": "badar"
},
{
"name3__qwer_1_ComponentId": "qwer"
},
{
"name3__qwer_1_InstanceId": "coramba"
},
{
"name3__qwer_2_ComponentId": "qwer"
},
{
"name3__qwer_2_InstanceId": "amba"
}
]

关于java - 从多层ObjectNode中检索线结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25749552/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com