扯了两天的足球闲片了,今儿该说一说技术话题了,碰巧了有一个比较实际的问题,聊一聊如何用技术方法解决,开发上我不是大牛,写得不好的,请大牛指出。
这几天因为一些特殊原因,网站值班表不能用,一旦出现问题,找相应系统的值班人员,就比较困难了,但通过一些渠道,可以有一个文本文件,其中包含了这几天的值班信息,为了更明白的说明问题,我们假设有A系统和B系统,两个值班,其中A系统值班人员为,每人值一天,
B系统值班人员为,每人值一天,
json格式的文件,准确的说,应该是json数组,如下所示,
{ "dlist": [ { "dId": "1743664", "dName": "A值班", "dPerson": "梅西", "dEmail": "abc@abc.com", "dPhone": "10000000000", "startDate": "2017-09-02 08:00:00", "endDate": "2017-09-02 18:00:59" }, { "dId": "1850998", "dName": "B值班", "dPerson": "C罗", "dEmail": "xyz@xyz.com", "dPhone": "10000000001", "startDate": "2017-09-02 00:00:01", "endDate": "2017-09-03 00:00:00" },
{ "dId": "1743600", "dName": "A值班", "dPerson": "内马尔", "dEmail": "jhk@jhk.com", "dPhone": "10000000002", "startDate": "2017-09-03 08:00:00", "endDate": "2017-09-04 18:00:59" }, { "dId": "1850901", "dName": "B值班", "dPerson": "阿扎尔", "dEmail": "lox@lox.com", "dPhone": "10000000003", "startDate": "2017-09-03 00:00:01", "endDate": "2017-09-04 00:00:00" }
] }
其实从这个文件中,直接使用ctrl+f,也能实现检索,但毕竟稍微不方便一些,另外就是想练练手,于是乎就考虑,清理一下格式,让其看起来更可读一些。
既然是json,那么就需要解析json,json解析器很多,这里则用了gson,
GSON是Google开发的Java API,用于转换Java对象和Json对象。更多关于GSON的API可以访问:http://sites.google.com/site/gson/.
最高版本是2.8,可以从以下网址,查看maven配置,或者直接下载jar,
http://www.mvnrepository.com/artifact/com.google.code.gson/gson
maven配置,
!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -- dependency groupIdcom.google.code.gson/groupId artifactIdgson/artifactId version2.8.0/version /dependency
使用gson解析json数据,可以分为三步,
- 首先需要创建Gson解析器。
- 创建JSONObject对象。
- 将json数据转为为相应的数据。
咱直接上代码,
package com.bisal.zb;
import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException;
import com.google.gson.JsonArray; import com.google.gson.JsonIOException; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.JsonSyntaxException;
public class ZB_1 { public static void main(String[] args) { try { JsonParser parser = new JsonParser(); // 创建JSON解析器 JsonObject object = (JsonObject) parser.parse(new FileReader( "file/zhiban.log")); // 创建JsonObject对象 JsonArray array = object.get("dlist").getAsJsonArray();
// 得到为json的数组 FileWriter writer = new FileWriter("file/output1.txt"); String dName; String dPerson; String dEmail; String dPhone; String dDate; for (int i = 0; i array.size(); i++) { JsonObject subObject = array.get(i).getAsJsonObject(); dutyName = subObject.get("dName").getAsString(); dutyPerson = subObject.get("dPerson").getAsString(); dutyPhone = subObject.get("dPhone").getAsString(); dutyEmail = subObject.get("dEmail").getAsString(); dutyDate = subObject.get("startDate").getAsString() .substring(0, 10); writer.write("日期=[" + dDate + "] 值班项=[" + dName + "] 值班人=[" + dPerson + "] 邮箱=[" + dEmail + "] 电话=[" + dPhone + "]n"); } writer.close(); } catch (JsonIOException e) { e.printStackTrace(); } catch (JsonSyntaxException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
解析json后,写入文件中,输出文件内容,
日期=[2017-09-02] 值班项=[A值班] 值班人=[梅西] 邮箱=[abc@abc.com] 电话=[10000000000]
日期=[2017-09-02] 值班项=[B值班] 值班人=[C罗] 邮箱=[xyz@xzy.com] 电话=[10000000001]
日期=[2017-09-03] 值班项=[A值班] 值班人=[内马尔] 邮箱=[jkh@jkh.com] 电话=[10000000002]
日期=[2017-09-03] 值班项=[B值班] 值班人=[阿扎尔] 邮箱=[lox@lox.com] 电话=[10000000003]
注意,这里是按照时间排序,同一个值班,每天都有,因此同一个值班,位置不是相邻的,我们日常检索,往往根据值班项,直接定位某一天的值班人员,所以可以据此做一些处理,按照值班项排序。
为了排序,首先定义一个实体类,重要的是,继承Comparable接口,重写compareTo方法,为的就是按照值班项dName,进行排序,此处为按照中文字符排序。
package com.bisal.zb;
public class ZBObject implements Comparable { private String dutyName; private String dutyPerson; private String dPhone; private String dEmail; private String dDate;
public String getDName() { return dName; }
public void setDName(String dName) { this.dName = dName; }
public String getDPerson() { return dPerson; }
public void setDPerson(String dPerson) { this.dPerson = dPerson; }
public String getDPhone() { return dPhone; }
public void setDPhone(String dPhone) { this.dPhone = dPhone; }
public String getDEmail() { return dEmail; }
public void setDEmail(String dEmail) { this.dEmail = dEmail; }
public String getDDate() { return dDate; }
public void setDDate(String dDate) { this.dDate = dDate; }
@Override public int compareTo(Object o) { ZBObject zbo = (ZBObject)o; String otherDName = zbo.getDName(); return this.dName.compareTo(otherDName); } }
解析json,将每一项数据,存储于ZBObject对象,用Collections.sort()方法,进行排序,
package com.bisal.zb;
import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.text.Collator; import java.util.ArrayList; import java.util.Collections; import java.util.List;
import com.google.gson.JsonArray; import com.google.gson.JsonIOException; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.JsonSyntaxException;
public class ZB_2 { public static void main(String[] args) { try { JsonParser parser = new JsonParser(); // 创建JSON解析器 JsonObject object = (JsonObject) parser.parse(new FileReader( "file/zhiban.log")); // 创建JsonObject对象 JsonArray array = object.get("dutylist").getAsJsonArray();
// 得到为json的数组 String dName = ""; String dPerson = ""; String dEmail = ""; String dPhone = ""; String dDate = ""; ListZBObject zbObjectList = new ArrayListZBObject(); for (int i = 0; i array.size(); i++) { JsonObject subObject = array.get(i).getAsJsonObject(); dName = subObject.get("dName").getAsString(); dPerson = subObject.get("dPerson").getAsString(); dPhone = subObject.get("dPhone").getAsString(); dEmail = subObject.get("dEmail").getAsString(); dDate = subObject.get("startDate").getAsString() .substring(0, 10); ZBObject zbObject = new ZBObject(); zbObject.setDName(dName); zbObject.setDPerson(dPerson); zbObject.setDEmail(dEmail); zbObject.setDPhone(dPhone); zbObject.setDDate(dDate); zbObjectList.add(zbObject); } FileWriter writer = new FileWriter("file/output2.txt"); ** Collections.sort(zbObjectList);** for (ZBObject zbo : zbObjectList) { writer.write("值班项=[" + zbo.getDName() + "] 日期=[" + zbo.getDDate() + "] 值班人=[" + zbo.getDPerson() + "] 邮箱=[" + zbo.getDEmail() + "] 电话=[" + zbo.getDPhone() + "]n"); } writer.close(); } catch (JsonIOException e) { e.printStackTrace(); } catch (JsonSyntaxException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
输出文件内容,
值班项=[A值班] 日期=[2017-09-02] 值班人=[梅西] 邮箱=[abc@abc.com] 电话=[10000000000]
值班项=[A值班] 日期=[2017-09-03] 值班人=[内马尔] 邮箱=[jkh@jkh.com] 电话=[10000000002]
值班项=[B值班] 日期=[2017-09-02] 值班人=[C罗] 邮箱=[xyz@xzy.com] 电话=[10000000001]
值班项=[B值班]日期=[2017-09-03] 值班人=[阿扎尔] 邮箱=[lox@lox.com] 电话=[10000000003]
按照值班项进行的排序,符合原始需求。
源代码可以从github上下载,
https://github.com/bisal-liu/java
如果您觉得此篇文章对您有帮助,欢迎关注微信公众号:bisal的个人杂货铺,您的支持是对我最大的鼓励!共同学习,共同进步:)