一、需求:
- 对Json文件进行读取,转成对象。
- 将封装好的对象反写成Json文件进行保存。
二、添加依赖
- 在
/app/libs
下添加fastjson-1.2.78.jar - 在
app/build.gradle
中添加依赖implementation files('libs/fastjson-1.2.78.jar')
,然后sync gradle文件。
三、读写操作
1.根据Json文件字段构建bean对象
{
"jobs":[
{
"task_name":"任务1",
"cycle":1,
"if_clean_back":1,
"sub_task_num":2,
"sub_task":[
{
"sub_task_name":"区域1",
"site_num":2,
"sub_cycle":1,
"point_list":[
{
"floor":0,
"site":1,
"op_count":1,
"op_list":[
{
"op_num":65291,
"parm1":0
}
]
}
]
}
]
}
]
}
以Root和Job类为例:
public class Root {
public List<Job> jobs = new ArrayList<>();
public Root() {
}
public List<Job> getJobs() {
return jobs;
}
public void setJobs(List<Job> jobs) {
this.jobs = jobs;
}
@Override
public String toString() {
return "Root{" +
"jobsList=" + jobs +
'}';
}
}
@JSONType(orders = {"task_name","cycle","if_clean_back","sub_task_num","sub_task"})//"task_id",
public class Job {
// public int task_id; //任务ID,占位,无实际用途
public String task_name; //任务名称,只用于UI显示
public int cycle; //任务循环次数
public int if_clean_back; //是否回扫,是:1;否:0;默认为是:1
public int sub_task_num; //子区域个数,
public List<Sub_Task> sub_task; //
public Job() {
}
public Job(String task_name, int cycle, int if_clean_back, int sub_task_num, List<Sub_Task> sub_task) {
// this.task_id = task_id;
this.task_name = task_name;
this.cycle = cycle;
this.if_clean_back = if_clean_back;
this.sub_task_num = sub_task_num;
this.sub_task = sub_task;
}
public String getTask_name() {
return task_name;
}
public void setTask_name(String task_name) {
this.task_name = task_name;
}
public int getCycle() {
return cycle;
}
public void setCycle(int cycle) {
this.cycle = cycle;
}
public int getIf_clean_back() {
return if_clean_back;
}
public void setIf_clean_back(int if_clean_back) {
this.if_clean_back = if_clean_back;
}
public int getSub_task_num() {
return sub_task_num;
}
public void setSub_task_num(int sub_task_num) {
this.sub_task_num = sub_task_num;
}
public List<Sub_Task> getSub_task() {
return sub_task;
}
public void setSub_task(List<Sub_Task> sub_task) {
this.sub_task = sub_task;
}
@Override
public String toString() {
return "Job{" +
", task_name='" + task_name + '\'' +
", cycle=" + cycle +
", if_clean_back=" + if_clean_back +
", sub_task_num=" + sub_task_num +
", subTaskList=" + sub_task +
'}';
}
}
此处bean对象中的变量要与Json文件中的字段名保持一致,对于数组字段,使用List变量与之对应。
@JSONType(orders = {"task_name","cycle","if_clean_back","sub_task_num","sub_task"})
是设置FastJson读写操作时的字段顺序,如果不设置,默认是按照变量首字母顺序进行读写。
注意:所有变量都要添加set()/get()方法,否则无法自动解析。
读Json文件
/**
* 读取AgvSingleJobs.json文件,转成Root实体
*
* @param path Json文件路径
* @return
*/
public Root readJson(String path) {
String jsonStr = FileIOUtil.readFile2String(path, "utf-8");//将文件转成字符串
Log.d(TAG, "read json string = " + jsonStr);
if (null == jsonStr || jsonStr.isEmpty()) {
return null;
}
//将字符串转成对象
return JSONObject.parseObject(jsonStr, Root.class);
}
这里FileIOUtil
类是自己封装的文件读写类。
写Json文件
/**
* 将Root类型实体写成Json文件
*
* @param rootBean Root实体
* @param path Json文件路径
*/
public void writeJsonFile(Root rootBean, String path) {
String jsonString = JsonUtils.convertObjectToJSON(rootBean);//job转string
FileIOUtil.writeFileFromString(path, jsonString);
}
public class JsonUtils {
private static final SerializeConfig config;
static {
config = new SerializeConfig();
config.put(java.util.Date.class, new JSONLibDataFormatSerializer()); // 使用和json-lib兼容的日期输出格式
config.put(java.sql.Date.class, new JSONLibDataFormatSerializer()); // 使用和json-lib兼容的日期输出格式
}
private static final SerializerFeature[] features = {SerializerFeature.WriteMapNullValue, // 输出空置字段
SerializerFeature.WriteNullListAsEmpty, // list字段如果为null,输出为[],而不是null
SerializerFeature.WriteNullNumberAsZero, // 数值字段如果为null,输出为0,而不是null
SerializerFeature.WriteNullBooleanAsFalse, // Boolean字段如果为null,输出为false,而不是null
SerializerFeature.WriteNullStringAsEmpty, // 字符类型字段如果为null,输出为"",而不是null
//开发环境调试使用,线上环境请取消,仅是格式化输出json设置,会输出太多无用空格
SerializerFeature.PrettyFormat
};
/**
* 实体类转换成Json
* @param object
* @return
*/
public static String convertObjectToJSON(Object object) {
return JSON.toJSONString(object, config, features);
}
}
这样就完成了Json文件的解析和写入。