为了账号安全,请及时绑定邮箱和手机立即绑定

如何将嵌套的 JSONArray 导出为 CSV?

如何将嵌套的 JSONArray 导出为 CSV?

慕桂英546537 2021-11-11 15:40:32
我有一个包含多个 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 是否有可能有这样的输出?
查看完整描述

1 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

抱歉,迟到的回复在过去 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,然后遍历 record 并获取所有项并将它们保存到 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


查看完整回答
反对 回复 2021-11-11
  • 1 回答
  • 0 关注
  • 168 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信