最近因工作需要,将批量的JSON转换为CSV文件,写了小工具类来实现这个功能。(批量方法未写)
主体代码部分:
package myJson2CSVTool;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Map.Entry;
import CSVUtils.CSVUtils;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
public class listJson2CSV {
//list类型的JSON写入CSV(理论上map一样可写入)
@SuppressWarnings({ "unchecked" })
public static void main(String[] args) throws IOException{
//获取JSON对象
String jsonStr = getJsonString();
JSONArray jsonArray = JSONArray.fromObject(jsonStr);
//生成list用以写入CSV
LinkedList<LinkedHashMap<String, String>> exportData = new LinkedList<LinkedHashMap<String, String>>();
//JSONArray导入list
for(Iterator<?> it = jsonArray.iterator();it.hasNext();){
JSONObject jsonObject= (JSONObject) it.next();
LinkedHashMap<String, String> dataMap = json2Map(jsonObject);
exportData.add(dataMap);
System.out.println(dataMap.toString());
}
//表头
LinkedHashMap<String, String> headMap = new LinkedHashMap<String, String>();
Iterator<?> it = exportData.get(0).entrySet().iterator();
while(it.hasNext()){
Map.Entry<String, String> entry = (Entry<String, String>) it.next();
String key = entry.getKey();
headMap.put(key,key);
}
CSVUtils.createCSVFile(exportData, headMap, "D:\\myjavawork\\myJson2CSVTool\\exportCSVFile", "文件导出");//生成CSV文件
}
//JSON转换为map
public static LinkedHashMap<String, String> json2Map(JSONObject jsonObject) throws IOException {
//转换为map对象
LinkedHashMap<String, String> dateMap= new LinkedHashMap<String, String>();
Iterator<?> iterator = jsonObject.keys();
while(iterator.hasNext()){
String key = (String) iterator.next();
String value = jsonObject.getString(key);
dateMap.put(key, value);
}
return dateMap;
}
//读取文件中的JSON字符串
@SuppressWarnings("resource")
private static String getJsonString() throws IOException {
String filePath = "D:\\myjavawork\\myJson2CSVTool\\jsonStringFile\\JSONString.txt";
String line = null;
//定义一个空字符串来接受读到的字符串
String str="";
BufferedReader in = new BufferedReader(new FileReader(filePath));
//循环把读取到的字符赋给str
while((line = in.readLine())!=null)
{
str+=line;
}
return str;
}
}
package CSVUtils;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import org.apache.commons.beanutils.BeanUtils;
/**
* 文件操作
*/
public class CSVUtils {
/**
* 生成为CVS文件
* @param exportData
* 源数据List
* @param map
* csv文件的列表头map
* @param outPutPath
* 文件路径
* @param fileName
* 文件名称
* @return
*/
@SuppressWarnings("rawtypes")
public static File createCSVFile(List exportData, LinkedHashMap map, String outPutPath,
String fileName) {
File csvFile = null;
BufferedWriter csvFileOutputStream = null;
try {
File file = new File(outPutPath);
if (!file.exists()) {
file.mkdir();
}
//定义文件名格式并创建
csvFile = File.createTempFile(fileName, ".csv", new File(outPutPath));
System.out.println("csvFile:" + csvFile);
// GBK使正确读取分隔符","
csvFileOutputStream = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(
csvFile), "GBK"), 1024);
System.out.println("csvFileOutputStream:" + csvFileOutputStream);
// 写入文件头部
for (Iterator propertyIterator = map.entrySet().iterator(); propertyIterator.hasNext();) {
java.util.Map.Entry propertyEntry = (java.util.Map.Entry) propertyIterator.next();
csvFileOutputStream.write("\"" + (String) propertyEntry.getValue() != null ? (String) propertyEntry.getValue() : "" + "\"");
if (propertyIterator.hasNext()) {
csvFileOutputStream.write(",");
}
}
csvFileOutputStream.newLine();
// 写入文件内容
for (Iterator iterator = exportData.iterator(); iterator.hasNext();) {
Object row = (Object) iterator.next();
for (Iterator propertyIterator = map.entrySet().iterator(); propertyIterator.hasNext();) {
java.util.Map.Entry propertyEntry = (java.util.Map.Entry) propertyIterator.next();
csvFileOutputStream.write((String) BeanUtils.getProperty(row,
(String) propertyEntry.getKey()));
if (propertyIterator.hasNext()) {
csvFileOutputStream.write(",");
}
}
if (iterator.hasNext()) {
csvFileOutputStream.newLine();
}
}
csvFileOutputStream.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
csvFileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return csvFile;
}
}