Java 如何将嵌套JSONArray导出到CSV?
我有一个包含多个JSONObject的JSONArrayJava 如何将嵌套JSONArray导出到CSV?,java,arrays,json,api,csv,Java,Arrays,Json,Api,Csv,我有一个包含多个JSONObject的JSONArray [ { "record":[ { "timeStamp":"2018-10-11T05:36:51+00:00", "code":200, "text":"OK" }, { "hostname":"qwe", "address":"192.168.1
[
{
"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,有可能有这样的输出吗?很抱歉,在过去的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();
}
我使用的所有代码都是由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
嘿,你能告诉我你在用什么JSON解析库吗?这样我就知道该用什么了Hi@Rab我在我的项目中使用org.json。Hi@Rab,我的json来自另一个收集api响应的类。这就是我创建导出类的方法:public void getCSVData(JSONArray JSONArray){}如何初始化来自另一个类的json?是的,您可以将json转换为字符串,然后在方法上生成一个参数
publicstaticstringgetcsvdata(stringjsondata)
我是否必须更改行Path jsonFile=Path.get(“json”)代码>?是的,你必须这么做。删除该行并将其更改为JSONArray JSONArray=newjsonarray(jsonData)
如果要将字符串放入String getCSVData(String jsonData)
我在线程“main”org.json.JSONException中得到了这个错误异常:JSONArray初始值应该是字符串或集合或数组。
我将其更改为JSONArray JSONArray=new JSONArray(jsonData);List jsonArrays=newarraylist()代码>
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