json格式值班表解析

这几天因为一些特殊原因,网站值班表不能用,一旦出现问题,找相应系统的值班人员,就比较困难了,但通过一些渠道,可以有一个文本文件,其中包含了这几天的值班信息,为了更明白的说明问题,我们假设有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>     <groupId>com.google.code.gson</groupId>     <artifactId>gson</artifactId>     <version>2.8.0</version> </dependency>

使用gson解析json数据,可以分为三步,

1. 首先需要创建Gson解析器。 2. 创建JSONObject对象。 3. 将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 = "";             List<ZBObject> zbObjectList = new ArrayList<ZBObject>();             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的个人杂货铺,您的支持是对我最大的鼓励!共同学习,共同进步:)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员同行者

Go语言标准库之time

获取时间戳 使用time.Now的time.Unix和time.UnixNano方法获取对应的时间戳

17820
来自专栏码洞

《快学 Go 语言》第 14 课 —— 反射

反射是 Go 语言学习的一个难点,但也是非常重要的一个知识点。反射是洞悉 Go 语言类型系统设计的法宝,Go 语言的 ORM 库离不开它,Go 语言的 json...

14030
来自专栏Golang语言社区

Golang学习笔记之Golang与Mysql交互

Go标准库中没有数据库驱动。参见http://golang.org/s/sqldrivers获取第三方驱动。 这里选择了Go-MySQL-Driver这个实现。...

34010
来自专栏Golang语言社区

sync.mutex 源代码分析

sync.Mutex是Go标准库中常用的一个排外锁。当一个 goroutine 获得了这个锁的拥有权后, 其它请求锁的 goroutine 就会阻塞在 Lock...

20930
来自专栏Golang语言社区

Golang学习笔记之WEB框架(gin)基本使用

Github地址:https://github.com/gin-gonic/gin gin的安装:go get github.com/gin-gonic/gin...

37520
来自专栏Golang语言社区

Golang学习笔记之日志log、zap

(1)Golang's log模块主要提供了3类接口。分别是 “Print 、Panic 、Fatal ”,对每一类接口其提供了3中调用方式,分别是 "Xxxx...

72320
来自专栏Golang语言社区

Golang TLS双向身份认证DoS漏洞分析(CVE-2018-16875)

如果程序源代码使用Go语言编写,并且用到了单向或者双向TLS认证,那么就容易受到CPU拒绝服务(DoS)攻击。Go语言的crypto/x509标准库中的校验算法...

20030
来自专栏程序员同行者

Golang Struct 声明和使用

Go可以声明自定义的数据类型,组合一个或多个类型,可以包含内置类型和用户自定义的类型,可以像内置类型一样使用struct类型

22330
来自专栏Golang语言社区

GPIOs and Go

Recently, I decided that I needed a small heads up display for import things I k...

17420
来自专栏码洞

《快学 Go 语言》第 14 课 —— 魔术变性指针

本节我们要学习一些 Go 语言的魔法功能,通过内置的 unsafe 包提供的功能,直接操纵指定内存地址的内存。有了 unsafe 包,我们就可以洞悉 Go 语言...

13850

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励