最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中怎樣使用JSON進(jìn)行文件解析

 更新時(shí)間:2023年05月12日 14:40:42   作者:鳴箏鳴箏  
這篇文章主要介紹了Java中怎樣使用JSON進(jìn)行文件解析問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、什么是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)文章

  • java代碼實(shí)現(xiàn)斗地主發(fā)牌功能

    java代碼實(shí)現(xiàn)斗地主發(fā)牌功能

    這篇文章主要介紹了java實(shí)現(xiàn)斗地主發(fā)牌功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • FastJson對(duì)于JSON格式字符串、JSON對(duì)象及JavaBean之間的相互轉(zhuǎn)換操作

    FastJson對(duì)于JSON格式字符串、JSON對(duì)象及JavaBean之間的相互轉(zhuǎn)換操作

    這篇文章主要介紹了FastJson對(duì)于JSON格式字符串、JSON對(duì)象及JavaBean之間的相互轉(zhuǎn)換,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-11-11
  • 一文徹底弄懂spring?boot自動(dòng)配置的過程(推薦)

    一文徹底弄懂spring?boot自動(dòng)配置的過程(推薦)

    SpringBoot的自動(dòng)配置機(jī)制通過@SpringBootApplication注解作為起點(diǎn),結(jié)合@EnableAutoConfiguration和spring.factories文件,實(shí)現(xiàn)了基于類路徑依賴、環(huán)境配置和自定義代碼的智能化配置,感興趣的朋友跟隨小編一起看看吧
    2024-10-10
  • 將Springboot項(xiàng)目升級(jí)成Springcloud項(xiàng)目的圖文教程

    將Springboot項(xiàng)目升級(jí)成Springcloud項(xiàng)目的圖文教程

    本文主要介紹了將Springboot項(xiàng)目升級(jí)成Springcloud項(xiàng)目,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • java獲取兩個(gè)List集合的交集代碼示例

    java獲取兩個(gè)List集合的交集代碼示例

    這篇文章主要給大家介紹了關(guān)于java獲取兩個(gè)List集合交集的相關(guān)資料,我們可以使用Stream操作來對(duì)集合進(jìn)行一系列的操作,其中包括求交集,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • 關(guān)于springboot中的SPI機(jī)制

    關(guān)于springboot中的SPI機(jī)制

    這篇文章主要介紹了springboot中的SPI機(jī)制,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Mybatis環(huán)境搭建和使用實(shí)例代碼

    Mybatis環(huán)境搭建和使用實(shí)例代碼

    MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲(chǔ)過程以及高級(jí)映射。本文重點(diǎn)給大家介紹Mybatis的環(huán)境搭建和使用實(shí)例代碼,需要的朋友參考下吧
    2017-12-12
  • Intellij IDEA中一次性折疊所有Java代碼的快捷鍵設(shè)置

    Intellij IDEA中一次性折疊所有Java代碼的快捷鍵設(shè)置

    這篇文章主要介紹了Intellij IDEA中一次性折疊所有Java代碼的快捷鍵設(shè)置,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Spring?Boot中@Validated注解不生效問題匯總大全

    Spring?Boot中@Validated注解不生效問題匯總大全

    這篇文章主要給大家介紹了關(guān)于Spring?Boot中@Validated注解不生效問題匯總的相關(guān)資料,@Validated注解是Spring框架中的一個(gè)注解,用于在方法參數(shù)上添加參數(shù)校驗(yàn)規(guī)則,需要的朋友可以參考下
    2023-07-07
  • Java實(shí)現(xiàn)監(jiān)聽文件變化的三種方案詳解

    Java實(shí)現(xiàn)監(jiān)聽文件變化的三種方案詳解

    這篇文章主要介紹了Java實(shí)現(xiàn)監(jiān)聽文件變化的三種方法,每種方案給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05

最新評(píng)論

济源市| 始兴县| 焦作市| 新丰县| 公安县| 温州市| 酉阳| 韩城市| 荥经县| 连云港市| 磴口县| 新竹县| 远安县| 宽甸| 庄浪县| 获嘉县| 新绛县| 诸城市| 鸡西市| 鄂州市| 洛隆县| 肇州县| 汶上县| 南木林县| 岑巩县| 子洲县| 新建县| 莱州市| 灵武市| 鹤岗市| 来安县| 茂名市| 凤凰县| 峨眉山市| 波密县| 万全县| 右玉县| 新绛县| 敖汉旗| 贡山| 山西省|