多维 JSON 到 CSV,在 JAVA 中工作的非嵌套 CSV 转换

Multidimentional JSON to CSV , non-nested CSV convertion working in JAVA

我有一个 JSON 文件,我需要将其压缩并从中创建一个 CSV。我能够转换为 CSV(我有一个“用户”包装器)但在“用户”内部有另一个名为“标识符”的包装器,我也想迭代它们并为它们创建一个字段。

我有一个 JSON 文件,如下所示:

{
  "users": [
    {
      "displayName": "Sharad Dutta",
      "givenName": "",
      "surname": "",
      "extension_user_type": "user",
      "identities": [
        {
          "signInType": "emailAddress",
          "issuerAssignedId": "kkr007@gmail.com"
        }
      ],
      "extension_timezone": "VET",
      "extension_locale": "en-GB",
      "extension_tenant": "EG12345"
    },
    {
      "displayName": "Wayne Rooney",
      "givenName": "Wayne",
      "surname": "Rooney",
      "extension_user_type": "user",
      "identities": [
        {
          "signInType": "userName",
          "issuerAssignedId": "kkr007"
        }
      ],
      "extension_timezone": "VET",
      "extension_locale": "en-GB",
      "extension_tenant": "EG12345"
    }
  ]
}

我正在尝试将 JSON 转换为 CSV,这是我能够做到的:

下面是代码:如您所见,我的 JSON 包装在 "users" 类型的包装器中,在 JSON 我有另一个包装器 "identities",使用我所做的代码,我能够迭代,但是 "identites" 出现 JSON blob,我想要这样的东西来代替 identites

issuerType       issuerAssignedId
bla bla bla      bla bla bla

而不是 JSON 嵌套的 blol 标识。

public static void main(String[] args) throws JSONException {

        String userJsonFile = "C:\Users\Administrator\Desktop\jsonRes\json_format_user_data_input_file.json";

        try {
            userJsonAsString = readFileAsAString(userJsonFile);
        } catch (Exception e1) {
            e1.printStackTrace();
        }
        JSONObject output;
        try {
            output = new JSONObject(userJsonAsString);
            JSONArray docs = output.getJSONArray("users");
           
            File file = new File("C:\Users\Administrator\Desktop\jsonRes\EmpDetails.csv");
            String csv = CDL.toString(docs);
            
            FileUtils.writeStringToFile(file, csv);
            System.out.println("Data has been Sucessfully Writeen to " + file);
            System.out.println(csv);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    private static String readFileAsAString(String inputJsonFile) throws Exception {
        
        return new String(Files.readAllBytes(Paths.get(inputJsonFile)));
    }

欢迎来到 SO! 正如您所说的那样,“identities”是一个嵌套的 JSON 数组,位于“users”数组的每个元素中。因此,当您扁平化为 more-or-less 关系格式(此处为 CSV)时,您通常需要为“identitites”数组的每个元素重复其余信息。

现在,无论您使用哪个 JSON 解析库(JSON您片段中的对象,我假设来自 org.json jar?),您需要遍历JSON数组文档并为每个元素调用 getJSONArray("identities")。

由于它是嵌套数组,因此您需要两个循环来处理这种情况。

“users”数组的外循环和“users”数组每个元素上“identities”的嵌套循环。

请仅将以下代码段用作参考。根据您的代码片段编写。请使用标准的变量命名和惯例。这只是为了向您展示逻辑

String userJsonAsString="";
    StringBuilder sBuild = new StringBuilder();
    StringBuilder sBuild2 = new StringBuilder();
    try {
        userJsonAsString  = readFileAsAString(userJsonFile);
    } catch (Exception e1) {
        e1.printStackTrace();
    }
    JSONObject output;
    try {
        output = new JSONObject(userJsonAsString);
        JSONArray docs = output.getJSONArray("users");
        
        Iterator<Object> iter =   docs.iterator();
        
        while(iter.hasNext()) {
            JSONObject userEleObj = (JSONObject)iter.next();
             JSONArray nestedIdArray = userEleObj.getJSONArray("identities");
             Iterator<Object> nestIter = nestedIdArray.iterator();
             
             while(nestIter.hasNext()) {
                 JSONObject identityEleObj = (JSONObject)nestIter.next(); 
                 identityEleObj.keySet().stream().forEach(key -> sBuild2.append(identityEleObj.get(key)+","));
                 userEleObj.keySet().stream().forEach(key -> {
                     if(StringUtils.equals(key, "identities")) {
                         sBuild.append(sBuild2.toString());
                         sBuild2.replace(0, sBuild2.length(), "");
                     } else {
                         sBuild.append(userEleObj.get(key)+","); 
                     }
                     
                     
                 });
                 
             }
             sBuild.replace(sBuild.lastIndexOf(","), sBuild.length(), "\n");
             
        }
       
   
        System.out.println(sBuild);
    } catch (Exception e) {
        e.printStackTrace();
    }