遞歸將JsonNode數據扁平化

聲明:

由於層級的json對象中名字可能會有重複,所有扁平化時key值帶上了父級的key
使用一個key的list列表,來判斷是否有重複的鍵插入,如果鍵已經存在,則跳過。
如果對於每個字段的信息都不可或缺,可以再判斷有重複鍵的時候,修改鍵值名稱,就能正常獲取插入值了。

    /**
     * 遞歸對jsonNode進行處理
     * @param map 要返回的表單對象
     * @param parentPath 父path
     * @param parentJsonNode 父節點對象
     */
    private void setNodePath(Map<String, Object> map, String parentPath, JsonNode parentJsonNode) {
        Iterator<String> sIterator = parentJsonNode.fieldNames();
        while(sIterator.hasNext()) {
            String key = sIterator.next();
            JsonNode jsonNode = parentJsonNode.get(key);
            if(jsonNode.isArray()) {
                for (int i = 0; i < jsonNode.size(); i++) {
                    if (null != jsonNode.get(0)) {
                        Iterator<String> grid = jsonNode.get(0).fieldNames();
                        while(grid.hasNext()) {
                            String child = grid.next();
                            JsonNode jn = jsonNode.get(0).get(child);
                            String mapKey = key + "." + child;
                            if (jn.isDouble()) {
                                if (map.containsKey(mapKey)) {
                                    map.put(mapKey, (Double)(map.get(mapKey)) + jn.asDouble());
                                } else {
                                    map.put(mapKey, jn.asDouble());
                                }
                            } else if (jn.isFloat()) {
                                if (map.containsKey(mapKey)) {
                                    map.put(mapKey, (Float)(map.get(mapKey)) + jn.asDouble());
                                } else {
                                    map.put(mapKey, jn.asDouble());
                                }
                            } else if (jn.isInt()) {
                                if (map.containsKey(mapKey)) {
                                    map.put(mapKey, (Integer)(map.get(mapKey)) + jn.asInt());
                                } else {
                                    map.put(mapKey, jn.asInt());
                                }
                            } else {
                                if (map.containsKey(mapKey)) {
                                    map.put(mapKey, (String)(map.get(mapKey)) + "," + jn.asText());
                                } else {
                                    map.put(mapKey, jn.asText());
                                }
                            }
                        }
                    }
                }
                map.put(key, jsonNode.toString());
            }
            else if(jsonNode.isValueNode()) {
                map.put(parentPath + "." + key, jsonNode.asText());
            }
            else if(jsonNode.isObject()) {
                setNodePath(map, parentPath + "." + key, jsonNode);
            }
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章