如需转载分享,请标明出处,且不用于盈利为目的,谢谢合作!
json字符串数据保存并生成dbf文件
简单介绍学习过程遇到的问题:
定义dbf文件字段fields[i].setName(names[i]);
时如果设置的名字是中文会报错,解决办法:
下载源码https://github.com/albfernandez/javadbf
打包 最新的javadbf版本1.10.2,支持dbf文件field字段为中文
步骤:
1.git clone https://github.com/albfernandez/javadbf.git
2.跳过test打包 mvn clean package compile -Dmaven.test.skip=true
3.将打的包放到本地maven库 mvn install:install-file -Dfile=D:\javadbf-1.10.2-SNAPSHOT.jar -DgroupId=commvn install:install-file -Dfile=D:\javadbf-1.10.2-SNAPSHOT.jar -DgroupId=com
1.添加pom.xml依赖
<!--javadbf-->
<dependency>
<groupId>com.github.albfernandez</groupId>
<artifactId>javadbf</artifactId>
<version>1.10.2</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
2.新建类JsonToDBF.java
package com.yss.file.filedown.util;
import com.linuxense.javadbf.DBFDataType;
import com.linuxense.javadbf.DBFField;
import com.linuxense.javadbf.DBFUtils;
import com.linuxense.javadbf.DBFWriter;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import java.io.File;
import java.io.FileOutputStream;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class JsonToDBF {
public static void createDbf(String src, JSONArray jsonArray) {
JSONObject first = jsonArray.getJSONObject(0);
Iterator<String> iterator = first.keys();
List<String> header = new ArrayList<>();
while (iterator.hasNext()) {
// 得到key
String key = (String) iterator.next();
header.add(key);
}
DBFWriter writer = null;
FileOutputStream fos = null;
try {
//定义DBF文件字段
DBFField[] fields = new DBFField[header.size()];
for (int i = 0; i < fields.length; i++) {
fields[i] = new DBFField();
fields[i].setName(header.get(i));
fields[i].setType(DBFDataType.CHARACTER);
fields[i].setLength(20);
}
fos = new FileOutputStream(new File(src));
//定义DBFWriter实例用来写DBF文件
writer = new DBFWriter(fos, Charset.forName("GBK"));
//把字段信息写入DBFWriter实例,即定义表结构
writer.setFields(fields);
for (int i = 0; i < jsonArray.size(); i++) {
// 得到数组的每项
JSONObject item = jsonArray.getJSONObject(i);
// 得到key集合
iterator = item.keys();
int j = 0;
Object[] rowData = new Object[header.size()];
while (iterator.hasNext()) {
// 得到key
String key = iterator.next();
// 得到key对应的value
String value = item.getString(key);
rowData[j++] = value;
}
writer.addRecord(rowData);
}
//写入数据
writer.write();
} catch (Exception e) {
e.printStackTrace();
} finally {
DBFUtils.close(fos);
DBFUtils.close(writer);
}
}
public static void main(String[] args) {
String str = "[\n" +
" {\n" +
" \"姓名\":\"张三\",\n" +
"\t \"性别\":\"男\",\n" +
"\t \"年龄\":\"22\"\n" +
" },\n" +
"\t {\n" +
" \"姓名\":\"李四\",\n" +
"\t \"性别\":\"男\",\n" +
"\t \"年龄\":\"23\"\n" +
" },\n" +
"\t {\n" +
" \"姓名\":\"王五\",\n" +
"\t \"性别\":\"男\",\n" +
"\t \"年龄\":\"22\"\n" +
" },\n" +
"\t {\n" +
" \"姓名\":\"张三丰\",\n" +
"\t \"性别\":\"男\",\n" +
"\t \"年龄\":\"100\"\n" +
" },\n" +
"\t {\n" +
" \"姓名\":\"楚雨荨\",\n" +
"\t \"性别\":\"女\",\n" +
"\t \"年龄\":\"22\"\n" +
" },\n" +
"\t {\n" +
" \"姓名\":\"张翰dfdfdf\",\n" +
"\t \"性别\":\"男\",\n" +
"\t \"年龄\":\"23\"\n" +
" },\n" +
"\t {\n" +
" \"姓名\":\"张无忌sdfdsfdsfdfdfdff\",\n" +
"\t \"性别\":\"男\",\n" +
"\t \"年龄\":\"24\"\n" +
" },\n" +
"\t {\n" +
" \"姓名\":\"赵敏\",\n" +
"\t \"性别\":\"女\",\n" +
"\t \"年龄\":\"23\"\n" +
" }\n" +
" ]";
JSONArray jsonArray = JSONArray.fromObject(str);
createDbf("D:/uselist.dbf", jsonArray);
}
}
3.结果数据展示