Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.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
多维JSON到CSV,非嵌套CSV转换在JAVA中工作_Java_Json_Csv_Export To Csv - Fatal编程技术网

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

多维JSON到CSV,非嵌套CSV转换在JAVA中工作,java,json,csv,export-to-csv,Java,Json,Csv,Export To Csv,我有一个JSON文件,我需要将其展开并从中创建CSV。我能够转换为CSV(我有一个“用户”包装器),但在“用户”中有另一个名为“标识符”的包装器,我也想迭代它们并为它们创建一个字段 我有一个JSON文件,如下所示: { "users": [ { "displayName": "Sharad Dutta", "givenName": "", "

我有一个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中我又有一个包装器“identies”,使用我编写的代码,我可以迭代,但是“identies”将作为JSON blob出现,我想要这样的东西来代替标识

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! 正如您正确地说的,“标识”是嵌套在“用户”数组的每个元素中的JSON数组。因此,当您扁平化为或多或少的关系格式(此处为CSV)时,通常需要为“identites”数组的每个元素重复其余信息

现在,无论您使用哪个JSON解析库(我假设代码段中的JSONObject来自org.JSON jar?),您都需要迭代JSONArray文档,并为每个元素调用getJSONArray(“标识”)

由于它是一个嵌套数组,因此需要两个循环来处理此场景

“用户”数组的外部循环和“用户”数组的每个元素上的“标识”的嵌套循环

请使用下面的代码片段作为参考。根据您的代码片段编写。请使用标准变量命名和实践。这只是向你展示逻辑

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();
    }
String userJsonAsString=”“;
StringBuilder sBuild=新建StringBuilder();
StringBuilder sBuild2=新的StringBuilder();
试一试{
userJsonAsString=readfileasasString(userJsonFile);
}捕获(异常e1){
e1.printStackTrace();
}
JSONObject输出;
试一试{
输出=新的JSONObject(userJsonAsString);
JSONArray docs=output.getJSONArray(“用户”);
迭代器iter=docs.Iterator();
while(iter.hasNext()){
JSONObject userEleObj=(JSONObject)iter.next();
JSONArray nesteddarray=userEleObj.getJSONArray(“标识”);
迭代器nesiter=nestedardray.Iterator();
while(nesiter.hasNext()){
JSONObject identityleobj=(JSONObject)nestIter.next();
identityleobj.keySet().stream().forEach(key->sBuild2.append(identityleobj.get(key)+“,”);
userEleObj.keySet().stream().forEach(键->{
if(StringUtils.equals(键,“标识”)){
sBuild.append(sBuild2.toString());
sBuild2.replace(0,sBuild2.length(),“”);
}否则{
sBuild.append(userEleObj.get(key)+“,”);
}
});
}
sBuild.replace(sBuild.lastIndexOf(“,”),sBuild.length(),“\n”);
}
系统输出打印LN(sBuild);
}捕获(例外e){
e、 printStackTrace();
}

首先展平JSON,然后将展平的结构写入CSV:还有更多。很多人使用了第三方库。我在从java库中寻找我可以使用的东西。我不知道,你能推荐一个开始吗?迭代器iter=docs.Iterator();我的IDE显示这不是有效的语法?这里缺少什么吗?对于类型JSONArray-->我得到的结果,方法迭代器()未定义。我认为这是因为我使用的是JSONArray,它是一种外部库。在这种情况下,无论您使用的是什么ext-lib-jar,您都可以用简单的for循环替换迭代器,并实现同样的效果。您将能够使用我的代码片段原样与Java8+和org.json-jar一起作为类路径中的库