今天小编给大家分享的是Java使用JSON进行文件解析的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。
一、什么是JSON
JSON是一种轻量级的数据交换格式。它基于ECMAScript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。
简洁和清晰的层次结构是的JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
JSON语法
使用大括号{ }保存对象,每个对象由若干个数据组成;
每个数据由key:value键值对组成;
数据之间使用逗号,分隔;
使用 进行特殊字符的转义
例如:
{"reason": "success","result": [{"id":1,"firstLetter":"A","brandName":"奥迪","brandLogo":"http"}, {"id":2,"firstLetter":"A","brandName":"雷克萨斯","brandLogo":"http"}, {"id":3,"firstLetter":"A","brandName":"奔驰","brandLogo":"ghjvh"}]
二、JSON的用途
JSON作为一种轻量级的数据格式,它的主要用途是在计算机系统之间进行数据的传递。
JSON作为数据传输的格式,有几个显著的优点:
(1)JSON只允许使用UTF-8编码,不存在编码问题;
(2)JSON内容仅包含key-value键值对,格式简单,不存在冗余结构,是一种轻量级结构;
(3)浏览器内置JSON支持,如果把数据用JSON发送给浏览器,可以用JavaScript直接处理;
所以,开发web应用的时候,使用JSON作为数据传输,在浏览器端非常方便。因为JSON非常适合JavaScript处理,所以,绝大多数REST API都选择JSON作为数据传输格式。
在使用Java进行应用程序的开发中,可能会遇到“将Java对象转换成JSON格式”或者“将JSON格式的数据转换成Java对象”的需求。
常用于解析JSON的第三方库有
-
Jackson
-
Gson
-
Fastjson
三、如何应用JSON
在应用JSON时我们最常用Fastjson这个库,Fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化微JSON字符串,也可以从JSON字符串反序列化到JavaBean。
Fastjson主要使用JSON、jsonObject、jsonArrary三个类。其中JSONArray和JSONObject继承自JSON。
JSON类
JSON类的作用主要是用于原始转换,常用方法有:
将Java对象“序列化“(转换)为JSON字符串。
使用:JSON.toJSONString(Object object),如果需要定义json中的key,可以使用@JSONField注解在成员变量进行设置
//实体数据 PoliceStation ps1=new PoliceStation(); ps1.setName("电子城派出所"); ps1.setAddr("雁塔区电子二路"); ps1.setTel("1234567890"); //序列化:将Java对象转换成json格式的数据 String s1=JSON.toJSONString(ps1); System.out.println(s1);
将JSON字符串反序列化为Java对象
JSON.parseObject(String text)
//反序列化:将json格式的字符串转换成Java对象 String s2="{"addr":"雁塔区电子二路", "name":"电子城派出所", "tel":"1234567890"} }"; PoliceStation ps2= JSON.parseObject(s2,PoliceStation.class); System.out.println(ps2);
JSON.parseArray(String text)
// json格式数据 String jsonStr = "[{ "name": "文保分局沪东高校派出所", "addr": "中山北一路801号", "tel": "22027732" }, { "name": "文保分局沪西高校派出所", "addr": "芙蓉江路55号", "tel": "62751704" }, { "name": "水上公安局吴淞水上派出所", "addr": "淞浦路187号", "tel": "56671442" }, { "name": "水上公安局杨浦水上派出所", "addr": "杨树浦路1291号", "tel": "65898004" }, { "name": "水上公安局外滩水上派出所", "addr": "中山东二路8弄3号", "tel": "63305388" }, { "name": "水上公安局石洞口水上派出所", "addr": "盛石路18号", "tel": "56152176" }, { "name": "轨道分局上海火车站站派出所", "addr": "共和新路2838号", "tel": "56650472" }, { "name": "轨道分局徐家汇站派出所", "addr": "沪闵路6707号", "tel": "63189188*70246" }, { "name": "轨道分局人民广场站派出所", "addr": "南京西路19号", "tel": "63189188*76369" }, { "name": "轨道分局陆家嘴站派出所", "addr": "龙阳路1990号乙", "tel": "63189188*27132" }, { "name": "轨道分局宜山路站派出所", "addr": "零陵路668号", ... "崇明县公安局新村派出所", "addr": "新村乡新中村新跃160号", "tel": "59650598" }, { "name": "崇明县公安局新海派出所", "addr": "新海农场场部北侧", "tel": "59655712" }, { "name": "崇明县公安局长征派出所", "addr": "长征农场派出所生活区长征农场场部", "tel": "59311459" }, { "name": "崇明县公安局长江派出所", "addr": "东风农场林风公路1579号", "tel": "59641914" }, { "name": "崇明县公安局东旺派出所", "addr": "前哨农场前哨公路18号", "tel": "59471109" }, { "name": "崇明县公安局东滩湿地保护区治安派出所", "addr": "陈家镇瀛陈公路崇明县团结沙", "tel": "59404611" }, { "name": "崇明县公安局长兴派出所", "addr": "长兴镇海舸路659号", "tel": "56851431" }, { "name": "崇明县公安局横沙派出所", "addr": "民东路1588号", "tel": "24060670" }]"; List<PoliceStation> stationList = JSON.parseArray(jsonStr, PoliceStation.class); for(PoliceStation ps : stationList) { System.out.println("警局名称:" + ps.getName()); System.out.println("警局地址:" + ps.getAddr()); System.out.println("联系电话:" + ps.getTel()); }
常见问题
问题1:FastJson默认过滤null值,不显示null字段
Map<String, Object> map = new HashMap<String, Object>(){ { put("age", 20); put("name", "灰灰"); put("sex", null); } }; System.out.println(JSONObject.toJSONString(map)); //输出结果 {"name:"灰灰","age":20}
解决方法:转换成JSON字符串时,使用Feature枚举值进行设置
Map<String, Object> map = new HashMap<String, Object>(){ { put("age", 20); put("name", "灰灰"); put("sex", null); } }; // 使用Feature类型的枚举值进行设置 System.out.println(JSONObject.toJSONString(map,Feature.WriteMapNullValue));
问题2:控制JSON的字段顺序
//实体类 public class PoliceStation { private String name; private String addr; private String tel; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddr() { return addr; } public void setAddr(String addr) { this.addr = addr; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } }
//测试类 PoliceStation ps = new PoliceStation(); ps.setName("电子城派出所"); ps.setAddr("雁塔区电子二路343号"); ps.setTel("13324554332"); System.out.println(JSON.toJSONString(ps)); //输出结果 {"addr":"雁塔区电子二路343号","name":"电子城派出所","tel":"13324554332"}
解决方法:输出结果与字段定义顺序不一致,需要在定义实体类字段时,使用@JSONField注解的ordinal属性进行顺序配置
import com.alibaba.fastjson2.annotation.JSONField; public class PoliceStation { @JSONField(ordinal = 1) private String name; @JSONField(ordinal = 2) private String addr; @JSONField(ordinal = 3) private String tel; }
问题3:控制JSON的Date字段格式
//实体类 // 订单类 public class Order{ // 订单编号 private String orderId; // 创建日期 private LocalDateTime creationTime; public Order() { this.orderId = UUID.randomUUID().toString(); this.creationTime = LocalDateTime.now(); } public String getOrderId() { return orderId; } public void setOrderId(String orderId) { this.orderId = orderId; } public LocalDateTime getCreationTime() { return creationTime; } public void setCreationTime(LocalDateTime creationTime) { this.creationTime = creationTime; } }
//测试类 public class Test { public static void main(String[] args) { Order order1 = new Order(); String json = JSON.toJSONString(order1); System.out.println(json); } } //输出结果 {"creationTime":"2022-07-10 19:39:07.377","orderId":"dbee4f0c-ced7-463f-b19b-c83234cbd5b0"}
解决方法:输出日期字段时,默认格式不符合需求时,可以在定义实体类的Date字段,使用@jsonFie注解的format属性进行格式配置
// 订单类 public class Order{ // 订单编号 private String orderId; // 创建日期 @JSONField(format = "yyyy-MM-dd HH:mm:ss") private LocalDateTime creationTime; }