将线性json转换为mule

时间:2017-01-28 09:12:56

标签: java json mule

我需要帮助将逻辑转换为一个json文件到另一个json文件。我试图在自定义java组件中没有dataweave的mule中实现这一点。

我想将线性json转换为嵌套json,输入数据是一个线性json,包含特定FTP服务器中所有文件和目录的详细信息。输出Json文件应该能够根据根目录嵌套文件和目录。以下是输入和输出json的示例。

{
  "InputJson": [
    {
      "type": "dir",
      "id": "RootDir",
      "name": "abcd",
      "Dir": "/abcd"
    },
    {          
      "type": "dir",
      "name": "Folder1",
      "Dir": "/abcd/Folder1",
      "id": "XXXXX"
    },
    {          
      "type": "file",
      "name": "Folder1SubFolder1",
      "Dir": "/abcd/Folder1/Folder1SubFolder1",
      "id": "XXXXXX"
    },
    {          
      "type": "dir",
      "name": "Folder2",
      "Dir": "/abcd/Folder2"
      "id": "XXXXXX"
    },
    {          
      "type": "dir",
      "name": "Folder2SubFolder1",
      "Dir": "/abcd/Folder2/Folder2SubFolder1"
      "id": "XXXXXX"
    },
    {          
      "type": "file",          
      "name": "Folder2SubFolder1SubFolder1",
      "Dir": "/abcd/Folder2/Folder2SubFolder1/Folder2SubFolder1SubFolder1"
      "id": "XXXXXX"
    }   
    ]
}

输出

    {
    "id": "RootDir",
    "value": "Files",
    "type": "folder"
    "OutData": [{
        "value": "Folder1",
        "OutData": [{
        "value": "Folder1SubFolder1"
        }       
       ]
     }
    ]
    "OutData": [{
        "value": "Folder2",
        "OutData": [{
        "value": "Folder2SubFolder1",
        "OutData":[{
         "value": "Folder2SubFolder1SubFolder1",
        }]
       }        
     ]
    }
   ]

2 个答案:

答案 0 :(得分:1)

逻辑

1. CREATE   (java) `outputElemtsList` = []  
2. FOR EACH (json) `inputElement` IN `InputJson`
3.   CREATE (java) `outputElemt`
4.   ADD   `outputElement` TO `outputElemtsList`
5.   IF    `outputElement` HAS `parent`
6.     ADD `outputElement` TO  `parent`.outData
7. CONVERT `outputElemtsList`[0] TO `Json`

假设,InputJson中的列表与样本一样排序(孩子永远不会来到他们的父母之前)

如果没有,您需要添加一些支票:

3. create `outputElement` if not in `outputElemtsList`; else continue
6. create `parent` if not in `outputElemtsList`

在实践中

您可以使用Json解析器(例如jakson)来:

// parse InputJson, to Java Objects 
Map<String, Object> rootNode = mapper.readValue(jsonString, Map.class);

// ... implement the logic  ...

// serialize a java Object into Json 
String outputJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(routOutputs);

代码

更新以区分文件和文件夹(dir)

1- OutputElement课程

public class OutputElement {
    String id, value, type;

    public void addOutData(OutputElement outputElement) {}

    // constructor, accessors ...
}

1.2- class OutputDir extends OutputElement

public class OutputElement {
    List<OutputElement> outData = new ArrayList<>();                 

    @Override
    public void addOutData(OutputElement outputElement) {        
        this.outData.add(outputElement);
    }
}

2- Main课程:LinearToNestedJson

检查outputElements List是否包含outputElement

的方法
public static boolean contains(List<OutputElement> outputElements, String value) {
    for (OutputElement outputElement : outputElements) {
        if (outputElement.getValue().equals(value))
            return true;
    }
    return false;
}

main方法

public static void main(String args[]) {
    JacksonTester tester = new JacksonTester();
    try {
        ObjectMapper mapper = new ObjectMapper();
        String jsonString = IN_JSON;

        @SuppressWarnings("unchecked")
        Map<String, Object> rootNode = mapper.readValue(jsonString, Map.class);

        @SuppressWarnings("unchecked")
        List<Map<String, Object>> inputElemnts = 
            (ArrayList<Map<String, Object>>) rootNode.getOrDefault("InputJson", null);
        List<OutputElement> outputElements = new ArrayList<>();

        for (Map inputElemnt : inputElemnts) {
            String fullpath = (String) inputElemnt.get("Dir");
            String[] tree = fullpath.substring(1).split("/");
            final int deepth = tree.length;
            String dirName = tree[deepth - 1];

            final String value = (String) inputElemnt.get("name");
            final String id = (String) inputElemnt.get("id");
            String type = (String) inputElemnt.get("type");                
            OutputElement outputElement;

            if (type != null && type.equals("dir")) {
                outputElement = new OutputDir();
            } else {
                if(type==null) type = "file";
                outputElement = new OutputElement();
            }

            outputElement.setValue(value);
            outputElement.setId(id);
            outputElement.setType(type);

            if (!contains(outputElements, value)) {
                outputElements.add(outputElement);
            }

            if (deepth > 1) {
                String parentName = tree[deepth - 2];

                for (OutputElement element : outputElements) {
                    if (element.getValue().equals(parentName)) {
                        element.addOutData(outputElement);
                    }
                }
            }

//            for (int i = 0; i < deepth -1; i++) {
//                System.out.println(tree[i]);
//            }
        }
        OutputElement routOutputs = outputElements.get(0);
        String outputJson = mapper.writerWithDefaultPrettyPrinter()
                                  .writeValueAsString(routOutputs);

        System.out.println(outputJson);

    } catch (JsonParseException | JsonMappingException e) {
    } catch (IOException e) {
    }
}

它的输出,对于给定的输入(在validation之后)

{
  "id" : "RootDir",
  "value" : "abcd",
  "type" : "dir",
  "outData" : [ {
    "id" : "XXXXX",
    "value" : "Folder1",
    "type" : "dir",
    "outData" : [ {
      "id" : "XXXXXX",
      "value" : "Folder1SubFolder1",
      "type" : "file"
    } ]
  }, {
    "id" : "XXXXXX",
    "value" : "Folder2",
    "type" : "dir",
    "outData" : [ {
      "id" : "XXXXXX",
      "value" : "Folder2SubFolder1",
      "type" : "dir",
      "outData" : [ {
        "id" : "XXXXXX",
        "value" : "Folder2SubFolder1SubFolder1",
        "type" : "file"
      } ]
    } ]
  } ]
}

答案 1 :(得分:1)

使用groupBy - 这正是您所需要的。 这是代码:

python -m pip install [package-name]

结果如下: enter image description here