【问题标题】:How to export a nested JSONArray to CSV?如何将嵌套的 JSONArray 导出为 CSV?
【发布时间】:2018-10-11 05:58:35
【问题描述】:

我有一个包含多个 JSONObjects 的 JSONArray

[
   {
      "record":[
         {
            "timeStamp":"2018-10-11T05:36:51+00:00",
            "code":200,
            "text":"OK"
         },
         {
            "hostname":"qwe",
            "address":"192.168.1.1",
            "type":"A",
            "priority":"0",
            "ttl":"3600"
         },
         {
            "hostname":"www",
            "address":"test.com",
            "type":"CNAME",
            "priority":"0",
            "ttl":"3600"
         }
      ]
   },
   {
      "record":[
         {
            "timeStamp":"2018-10-11T05:36:52+00:00",
            "code":200,
            "text":"OK"
         },
         {
            "hostname":"rty",
            "address":"192.168.1.2",
            "type":"A",
            "priority":"0",
            "ttl":"300"
         },
         {
            "hostname":"*",
            "address":"test",
            "type":"CNAME",
            "priority":"0",
            "ttl":"3600"
         }
      ]
   }
]

如何解析这个 JSONArray 并将其导出为 CSV 文件。

这是我迄今为止尝试过的

    File file=new File("/home/administrator/Desktop/test.csv");
    String csv = jsonArray;
    FileUtils.writeStringToFile(file, csv);
    System.out.println("CSV created.");

我想要的输出是

timeStamp,code,text,hostname,address,type,priority,ttl,hostname,address,type,priority,ttl
    2018-10-11T05:36:51+00:00,200,OK,qwe,192.168.1.1,A,0,300,www,test.com,CNAME,0,3600
    2018-10-11T05:36:52+00:00,200,OK,rty,192.168.1.2,A,0,300,*,test,CNAME,0,3600

给定上面的 JSONArray 是否有可能得到这样的输出?

【问题讨论】:

  • 嘿,你能告诉我你正在使用什么 JSON Parsing lib,所以我知道该使用什么吗? :)
  • 嗨@Rab 我在我的项目中使用 org.json。

标签: java arrays json api csv


【解决方案1】:

抱歉,在过去的 30 分钟里一直在敲键盘,但我终于完成了,这是代码。

public static String getCSVData() throws IOException, JSONException {
    Path jsonFile = Paths.get("json");
    String json = new String(Files.readAllBytes(jsonFile), StandardCharsets.UTF_8);
    JSONArray jsonArray = new JSONArray(json.trim());
    List<List<String>> jsonArrays = new ArrayList<>();
    for (int i = 0; i < jsonArray.length(); i++) {
        List<String> jsonObjects = new ArrayList<>();
        JSONArray record = jsonArray.getJSONObject(i).getJSONArray("record");
        for (int i2 = 0; i2 < record.length(); i2++) {
            JSONObject jsonObject = record.getJSONObject(i2);
            if (i2 == 0) {
                jsonObjects.add(jsonObject.get("timeStamp").toString());
                jsonObjects.add(jsonObject.get("code").toString());
                jsonObjects.add(jsonObject.get("text").toString());
            } else {
                jsonObjects.add(jsonObject.get("hostname").toString());
                jsonObjects.add(jsonObject.get("address").toString());
                jsonObjects.add(jsonObject.get("type").toString());
                jsonObjects.add(jsonObject.get("priority").toString());
                jsonObjects.add(jsonObject.get("ttl").toString());
            }
        }
        jsonArrays.add(jsonObjects);
    }
    StringBuilder stringBuilder = new StringBuilder("timeStamp,code,text,hostname,address,type,priority,ttl,hostname,address,type,priority,ttl\n");
    for(List<String> arrays : jsonArrays){
        stringBuilder.append(StringUtils.join(arrays, ",")).append("\n");
    }
    return stringBuilder.toString().trim();
}

为了解释代码,我首先循环了第一个数组,然后获取第一个 JSONArray 的 jsonObject,然后从我通过循环第一个 JSONArray 得到的 JsonObject 中获取名为“record”的 jsonArray,然后循环记录和获取所有项目并将它们保存到 ArrayList 中。并通过 JDK 提供的 StringUtils 加入它们。

如果你想把它写到文件中使用这个

Files.write(Paths.get("YOUR CSV FILE"), getCSVData().getBytes(StandardCharsets.UTF_8)); 

我使用的所有代码都是JDK和org.json提供的。

在我们打印出 getCSVDate(); 之后输出是:

timeStamp,code,text,hostname,address,type,priority,ttl,hostname,address,type,priority,ttl
2018-10-11T05:36:51+00:00,200,OK,qwe,192.168.1.1,A,0,3600,www,test.com,CNAME,0,3600
2018-10-11T05:36:52+00:00,200,OK,rty,192.168.1.2,A,0,300,*,test,CNAME,0,3600

【讨论】:

  • 嗨@Rab,我的json来自另一个收集api响应的类。这就是我创建用于导出的类的方式: public void getCSVData(JSONArray jsonArray){ } 如何初始化来自其他类的 json?
  • 是的,你可以把JSON转成字符串,然后在方法上做一个参数。 public static String getCSVData(String jsonData)
  • 我必须换行Path jsonFile = Paths.get("json");吗?
  • 是的,你必须这样做。如果您想将字符串放入String getCSVData(String jsonData),请删除该行并将其更改为JSONArray jsonArray = new JSONArray(jsonData);
  • 我收到此错误Exception in thread "main" org.json.JSONException: JSONArray initial value should be a string or collection or array. 我将其更改为JSONArray jsonArray = new JSONArray(jsonData); List&lt;List&lt;String&gt;&gt; jsonArrays = new ArrayList&lt;&gt;();
猜你喜欢
  • 2020-11-21
  • 2019-08-01
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
相关资源
最近更新 更多