Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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 从多层ObjectNode检索行结构_Java_Json_Parsing_Jackson_Gson - Fatal编程技术网

Java 从多层ObjectNode检索行结构

Java 从多层ObjectNode检索行结构,java,json,parsing,jackson,gson,Java,Json,Parsing,Jackson,Gson,我有一个ObjectNode作为输入参数,我不知道这个节点的确切结构。我的意思是,它可以包含任意数量的层,从非常简单的NameValuePair数组到复杂的结构,如HashMap。如何将其解析为简单的平面结构,如NameValuePair数组? 我以前用已知的结构为ObjectNodes做过,但现在我不知道 我感谢任何帮助和想法 添加详细信息: 例如,如果我知道,在ObjectNode中,我总是只找到HashMap,仅此而已,我可以执行以下操作: ObjectNode parametersNod

我有一个
ObjectNode
作为输入参数,我不知道这个节点的确切结构。我的意思是,它可以包含任意数量的层,从非常简单的
NameValuePair
数组到复杂的结构,如
HashMap
。如何将其解析为简单的平面结构,如
NameValuePair
数组? 我以前用已知的结构为
ObjectNodes
做过,但现在我不知道

我感谢任何帮助和想法

添加详细信息: 例如,如果我知道,在ObjectNode中,我总是只找到
HashMap
,仅此而已,我可以执行以下操作:

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转换为名称-值对的平面数组?有没有通用的算法

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

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

因为我没有得到答案,所以我自己做了。对于那些将面临同样问题的人,我将其张贴在这里。 它没有任何递归,我在不应该使用HashMap的地方使用了HashMap,但这是一个概念证明,旨在进行重构。 请注意,它是通过邮递员在开关站上作为Web服务进行测试的,所以没有主要方法

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__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"
    }
]

请添加更多细节,一些代码too@Coffee我编辑了我的消息,现在它更有意义了吗?您能为您添加的所有示例显示所需的输出吗?@MichałZiober我编辑了第一条消息,添加了我需要的JSON。这就足够更好地理解了吗?谢谢。是的,现在看起来好多了。谢谢如果两个对象具有相同的属性“name”,该怎么办。我们应该在结果对象中看到什么?
{
  "name":"value",
  "name1":"value1",
  "name2":"value2"
}
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"
    }
]