Java中怎樣使用JSON進(jìn)行文件解析
一、什么是JSON
JSON是一種輕量級(jí)的數(shù)據(jù)交換格式。它基于ECMAScript的一個(gè)子集,采用完全獨(dú)立于編程語(yǔ)言的文本格式來存儲(chǔ)和表示數(shù)據(jù)。
簡(jiǎn)潔和清晰的層次結(jié)構(gòu)是的JSON成為理想的數(shù)據(jù)交換語(yǔ)言。易于人閱讀和編寫,同時(shí)也易于機(jī)器解析和生成,并有效地提升網(wǎng)絡(luò)傳輸效率。
JSON語(yǔ)法
使用大括號(hào){ }保存對(duì)象,每個(gè)對(duì)象由若干個(gè)數(shù)據(jù)組成;
每個(gè)數(shù)據(jù)由key:value鍵值對(duì)組成;
數(shù)據(jù)之間使用逗號(hào),分隔;
使用 \ 進(jìn)行特殊字符的轉(zhuǎn)義
例如:
{"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作為一種輕量級(jí)的數(shù)據(jù)格式,它的主要用途是在計(jì)算機(jī)系統(tǒng)之間進(jìn)行數(shù)據(jù)的傳遞。
JSON作為數(shù)據(jù)傳輸?shù)母袷?,有幾個(gè)顯著的優(yōu)點(diǎn):
(1)JSON只允許使用UTF-8編碼,不存在編碼問題;
(2)JSON內(nèi)容僅包含key-value鍵值對(duì),格式簡(jiǎn)單,不存在冗余結(jié)構(gòu),是一種輕量級(jí)結(jié)構(gòu);
(3)瀏覽器內(nèi)置JSON支持,如果把數(shù)據(jù)用JSON發(fā)送給瀏覽器,可以用JavaScript直接處理;
所以,開發(fā)web應(yīng)用的時(shí)候,使用JSON作為數(shù)據(jù)傳輸,在瀏覽器端非常方便。因?yàn)镴SON非常適合JavaScript處理,所以,絕大多數(shù)REST API都選擇JSON作為數(shù)據(jù)傳輸格式。
在使用Java進(jìn)行應(yīng)用程序的開發(fā)中,可能會(huì)遇到“將Java對(duì)象轉(zhuǎn)換成JSON格式”或者“將JSON格式的數(shù)據(jù)轉(zhuǎn)換成Java對(duì)象”的需求。
常用于解析JSON的第三方庫(kù)有
- Jackson
- Gson
- Fastjson
三、如何應(yīng)用JSON
在應(yīng)用JSON時(shí)我們最常用Fastjson這個(gè)庫(kù),F(xiàn)astjson是阿里巴巴的開源JSON解析庫(kù),它可以解析JSON格式的字符串,支持將Java Bean序列化微JSON字符串,也可以從JSON字符串反序列化到JavaBean。
Fastjson主要使用JSON、jsonObject、jsonArrary三個(gè)類。其中JSONArray和JSONObject繼承自JSON。
JSON類
JSON類的作用主要是用于原始轉(zhuǎn)換,常用方法有:
將Java對(duì)象“序列化“(轉(zhuǎn)換)為JSON字符串。
使用:JSON.toJSONString(Object object),如果需要定義json中的key,可以使用@JSONField注解在成員變量進(jìn)行設(shè)置
//實(shí)體數(shù)據(jù) PoliceStation ps1=new PoliceStation(); ps1.setName("電子城派出所"); ps1.setAddr("雁塔區(qū)電子二路"); ps1.setTel("1234567890"); //序列化:將Java對(duì)象轉(zhuǎn)換成json格式的數(shù)據(jù) String s1=JSON.toJSONString(ps1); System.out.println(s1);
將JSON字符串反序列化為Java對(duì)象
JSON.parseObject(String text)
//反序列化:將json格式的字符串轉(zhuǎn)換成Java對(duì)象 String s2="{\"addr\":\"雁塔區(qū)電子二路\", \"name\":\"電子城派出所\", \"tel\":\"1234567890\"}\r\n }"; PoliceStation ps2= JSON.parseObject(s2,PoliceStation.class); System.out.println(ps2);
JSON.parseArray(String text)
// json格式數(shù)據(jù) String jsonStr = "[{ \"name\": \"文保分局滬東高校派出所\", \"addr\": \"中山北一路801號(hào)\", \"tel\": \"22027732\" }, { \"name\": \"文保分局滬西高校派出所\", \"addr\": \"芙蓉江路55號(hào)\", \"tel\": \"62751704\" }, { \"name\": \"水上公安局吳淞水上派出所\", \"addr\": \"淞浦路187號(hào)\", \"tel\": \"56671442\" }, { \"name\": \"水上公安局楊浦水上派出所\", \"addr\": \"楊樹浦路1291號(hào)\", \"tel\": \"65898004\" }, { \"name\": \"水上公安局外灘水上派出所\", \"addr\": \"中山東二路8弄3號(hào)\", \"tel\": \"63305388\" }, { \"name\": \"水上公安局石洞口水上派出所\", \"addr\": \"盛石路18號(hào)\", \"tel\": \"56152176\" }, { \"name\": \"軌道分局上海火車站站派出所\", \"addr\": \"共和新路2838號(hào)\", \"tel\": \"56650472\" }, { \"name\": \"軌道分局徐家匯站派出所\", \"addr\": \"滬閔路6707號(hào)\", \"tel\": \"63189188*70246\" }, { \"name\": \"軌道分局人民廣場(chǎng)站派出所\", \"addr\": \"南京西路19號(hào)\", \"tel\": \"63189188*76369\" }, { \"name\": \"軌道分局陸家嘴站派出所\", \"addr\": \"龍陽(yáng)路1990號(hào)乙\", \"tel\": \"63189188*27132\" }, { \"name\": \"軌道分局宜山路站派出所\", \"addr\": \"零陵路668號(hào)\", ... \"崇明縣公安局新村派出所\", \"addr\": \"新村鄉(xiāng)新中村新躍160號(hào)\", \"tel\": \"59650598\" }, { \"name\": \"崇明縣公安局新海派出所\", \"addr\": \"新海農(nóng)場(chǎng)場(chǎng)部北側(cè)\", \"tel\": \"59655712\" }, { \"name\": \"崇明縣公安局長(zhǎng)征派出所\", \"addr\": \"長(zhǎng)征農(nóng)場(chǎng)派出所生活區(qū)長(zhǎng)征農(nóng)場(chǎng)場(chǎng)部\", \"tel\": \"59311459\" }, { \"name\": \"崇明縣公安局長(zhǎng)江派出所\", \"addr\": \"東風(fēng)農(nóng)場(chǎng)林風(fēng)公路1579號(hào)\", \"tel\": \"59641914\" }, { \"name\": \"崇明縣公安局東旺派出所\", \"addr\": \"前哨農(nóng)場(chǎng)前哨公路18號(hào)\", \"tel\": \"59471109\" }, { \"name\": \"崇明縣公安局東灘濕地保護(hù)區(qū)治安派出所\", \"addr\": \"陳家鎮(zhèn)瀛陳公路崇明縣團(tuán)結(jié)沙\", \"tel\": \"59404611\" }, { \"name\": \"崇明縣公安局長(zhǎng)興派出所\", \"addr\": \"長(zhǎng)興鎮(zhèn)海舸路659號(hào)\", \"tel\": \"56851431\" }, { \"name\": \"崇明縣公安局橫沙派出所\", \"addr\": \"民東路1588號(hào)\", \"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("聯(lián)系電話:" + ps.getTel()); }
常見問題
問題1:FastJson默認(rèn)過濾null值,不顯示null字段
Map<String, Object> map = new HashMap<String, Object>(){ { put("age", 20); put("name", "灰灰"); put("sex", null); } }; System.out.println(JSONObject.toJSONString(map)); //輸出結(jié)果 {"name:"灰灰","age":20}
解決方法:轉(zhuǎn)換成JSON字符串時(shí),使用Feature枚舉值進(jìn)行設(shè)置
Map<String, Object> map = new HashMap<String, Object>(){ { put("age", 20); put("name", "灰灰"); put("sex", null); } }; // 使用Feature類型的枚舉值進(jìn)行設(shè)置 System.out.println(JSONObject.toJSONString(map,Feature.WriteMapNullValue));
問題2:控制JSON的字段順序
//實(shí)體類 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; } }
//測(cè)試類 PoliceStation ps = new PoliceStation(); ps.setName("電子城派出所"); ps.setAddr("雁塔區(qū)電子二路343號(hào)"); ps.setTel("13324554332"); System.out.println(JSON.toJSONString(ps)); //輸出結(jié)果 {"addr":"雁塔區(qū)電子二路343號(hào)","name":"電子城派出所","tel":"13324554332"}
解決方法:輸出結(jié)果與字段定義順序不一致,需要在定義實(shí)體類字段時(shí),使用@JSONField注解的ordinal屬性進(jìn)行順序配置
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字段格式
//實(shí)體類 // 訂單類 public class Order{ // 訂單編號(hào) private String orderId; // 創(chuàng)建日期 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; } }
//測(cè)試類 public class Test { public static void main(String[] args) { Order order1 = new Order(); String json = JSON.toJSONString(order1); System.out.println(json); } } //輸出結(jié)果 {"creationTime":"2022-07-10 19:39:07.377","orderId":"dbee4f0c-ced7-463f-b19b-c83234cbd5b0"}
解決方法:輸出日期字段時(shí),默認(rèn)格式不符合需求時(shí),可以在定義實(shí)體類的Date字段,使用@jsonFie注解的format屬性進(jìn)行格式配置
// 訂單類 public class Order{ // 訂單編號(hào) private String orderId; // 創(chuàng)建日期 @JSONField(format = "yyyy-MM-dd HH:mm:ss") private LocalDateTime creationTime; }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringCloud?Gateway中GatewayFilterChain執(zhí)行流程詳解
Spring?Cloud?Gateway旨在為微服務(wù)架構(gòu)提供一種簡(jiǎn)單有效的、統(tǒng)一的?API?路由管理方式。Spring?Cloud?Gateway?作為?Spring?Cloud?生態(tài)系中的網(wǎng)關(guān),它不僅提供統(tǒng)一的路由方式,并且基于?Filter?鏈的方式提供了網(wǎng)關(guān)基本的功能,例如:安全、監(jiān)控/埋點(diǎn)和限流等2022-10-10spring-boot-starter-validation?校驗(yàn)參數(shù)的實(shí)現(xiàn)
參數(shù)校驗(yàn)在很多地方都可以用到,本文主要介紹了spring-boot-starter-validation?校驗(yàn)參數(shù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04Java計(jì)算兩個(gè)漢字相似度的實(shí)現(xiàn)方法
有時(shí)候我們希望計(jì)算兩個(gè)漢字的相似度,比如文本的 OCR 等場(chǎng)景,用于識(shí)別糾正,本文給大家詳細(xì)介紹了Java計(jì)算兩個(gè)漢字相似度的實(shí)現(xiàn)方法,文中有詳細(xì)的實(shí)現(xiàn)代碼,需要的朋友可以參考下2023-11-11java網(wǎng)絡(luò)通信技術(shù)之簡(jiǎn)單聊天小程序
這篇文章主要為大家詳細(xì)介紹了java網(wǎng)絡(luò)通信技術(shù)之簡(jiǎn)單聊天小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07SpringBoot實(shí)現(xiàn)接口等冪次校驗(yàn)的示例代碼
本文主要介紹了SpringBoot實(shí)現(xiàn)接口等冪次校驗(yàn)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01官方詳解HDFS?Balancer工具主要調(diào)優(yōu)參數(shù)
這篇文章主要為大家介紹了HDFS?Balancer工具主要調(diào)優(yōu)參數(shù)的?官方詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03springBoot啟動(dòng)時(shí)讓方法自動(dòng)執(zhí)行的幾種實(shí)現(xiàn)方式
這篇文章主要介紹了springBoot啟動(dòng)時(shí)讓方法自動(dòng)執(zhí)行的幾種實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03