【问题标题】:Multidimentional JSON to CSV , non-nested CSV convertion working in JAVA多维 JSON 到 CSV ,在 JAVA 中工作的非嵌套 CSV 转换
【发布时间】:2021-01-03 07:58:27
【问题描述】:

我有一个 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 嵌套块。

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)));
    }

【问题讨论】:

标签: java json csv export-to-csv


【解决方案1】:

欢迎来到 SO! 正如您所说的那样,“身份”是“用户”数组的每个元素内的嵌套 JSON 数组。因此,当您扁平化为或多或少的关系格式(此处为 CSV)时,您通常需要为“identitites”数组的每个元素重复其余信息。

现在,无论您使用的是哪个 JSON 解析库(您 sn-p 中的 JSONObject,我假设来自 org.json jar?),您都需要遍历 JSONArray 文档并为每个元素调用 getJSONArray("身份”)。

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

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

请使用下面的 sn-p 作为参考。已经按照你的代码sn -p写了。请使用标准变量命名和实践。这只是为了向您展示逻辑

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();
    }

【讨论】:

  • 我想不通,你能建议一个开始吗?
  • 迭代器 iter = docs.iterator();我的 IDE 显示这不是有效的语法?我在这里错过了什么吗?
  • JSONArray 类型的方法 iterator() 未定义 --> 我得到了这个。我认为这是因为我使用的是外部库 JSONArray。
  • 在这种情况下,无论您使用的是什么 ext lib jar,您都可以用简单的 for 循环替换迭代器并实现相同的效果
  • 您将能够将我的 sn-p 与 Java8+ 和 org.json jar 一起用作类路径中的库
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 2014-09-06
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多