問題:JSON數(shù)據(jù)如何進行解析呢含懊,方式有哪些身冬?
這個問題是我們作為程序員幾乎每天都要進行的操作,那它有多少種方式呢岔乔,我們這里就這點來說一說酥筝。
解析的四種方式
官方解析
谷歌 Gson 解析
阿里巴巴 FastJson 解析
Jackson 解析
案例實操
這里我們就只討論對象與 json 如何互相轉(zhuǎn)換。
這里我們先創(chuàng)建好 Maven 項目雏门,方便引入依賴嘿歌,通過單元測試來實際檢驗我們不同的解析方式。
下面我們都使用 User 對象茁影,先創(chuàng)建好我們需要的類宙帝。
User.java
packageorg.example;
?
publicclassUser{
?
privateStringname;
privateStringsex;
privateIntegerage;
?
publicUser() {
?? }
?
publicUser(Stringname,Stringsex,Integerage) {
this.name=name;
this.sex=sex;
this.age=age;
?? }
?
publicStringgetName() {
returnname;
?? }
?
publicvoidsetName(Stringname) {
this.name=name;
?? }
?
publicStringgetSex() {
returnsex;
?? }
?
publicvoidsetSex(Stringsex) {
this.sex=sex;
?? }
?
publicIntegergetAge() {
returnage;
?? }
?
publicvoidsetAge(Integerage) {
this.age=age;
?? }
?
@Override
publicStringtoString() {
return"User{"+
"name='"+name+'\''+
", sex='"+sex+'\''+
", age="+age+
'}';
?? }
}
?
官方解析
官方提供的 json 解析方式,比較繁瑣募闲,所以用的人比較少步脓。
第一步,引入依賴:
<!--json官方-->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20160810</version>
</dependency>
第二步,編寫測試代碼:
packageorg.example;
?
importorg.json.JSONObject;
importorg.springframework.stereotype.Component;
?
/**
* 官方解析
*/
@Component
publicclassJsonTest1{
?
/**
* 對象轉(zhuǎn)json
* @param user
* @return
*/
publicStringuserToJson(Useruser){
JSONObjectjsonObject=newJSONObject(user);
StringjsonStr=jsonObject.toString();
returnjsonStr;
?? }
?
/**
* json轉(zhuǎn)對象
* @param json
* @return
*/
publicUseruserFromJson(Stringjson){
JSONObjectjsonObject=newJSONObject(json);
Stringname=jsonObject.getString("name");
Stringsex=jsonObject.getString("sex");
intage=jsonObject.getInt("age");
Useruser=newUser(name,sex,age);
returnuser;
?? }
?
}
第三步靴患,單元測試:
packageorg.example;
?
importorg.junit.Test;
importorg.junit.runner.RunWith;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.test.context.ContextConfiguration;
importorg.springframework.test.context.junit4.SpringJUnit4ClassRunner;
?
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:spring.xml")
publicclassJsonTest1Test{
?
@Autowired
privateJsonTest1jsonTest1;
?
@Test
publicvoiduserToJson() {
Useruser=newUser("秦明","man",18);
Stringjson=jsonTest1.userToJson(user);
System.out.println(json);
?? }
?
@Test
publicvoiduserFromJson() {
Stringjson="{\"sex\":\"man\",\"name\":\"秦明\",\"age\":18}";
Useruser=jsonTest1.userFromJson(json);
System.out.println(user);
?? }
}
第四步仍侥,查看結(jié)果:
谷歌 Gson 解析
第一步,引入依賴:
<!--gson-->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
第二步鸳君,編寫測試代碼:
packageorg.example;
?
importcom.google.gson.Gson;
importorg.springframework.stereotype.Component;
?
/**
* gson解析
*/
@Component
publicclassJsonTest2{
?
/**
* 對象轉(zhuǎn)json
* @param user
* @return
*/
publicStringuserToJson(Useruser){
Gsongson=newGson();
Stringjson=gson.toJson(user);
returnjson;
?? }
?
/**
* json轉(zhuǎn)對象
* @param json
* @return
*/
publicUseruserFromJson(Stringjson){
Gsongson=newGson();
Useruser=gson.fromJson(json,User.class);
returnuser;
?? }
?
}
第三步农渊,單元測試:同上(下面第三步和第四步和上面都一樣,所以下面省略)
第四步或颊,查看結(jié)果:同上
阿里巴巴 FastJson 解析
這個解析方式是由阿里巴巴開發(fā)出來的砸紊,效率最高,深受大家喜愛囱挑,功能強大醉顽,想要更深入學(xué)習(xí)的可以查看 FastJson 官網(wǎng)API。
第一步平挑,引入依賴:
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
第二步徽鼎,編寫測試代碼:
packageorg.example;
?
importcom.alibaba.fastjson.JSONObject;
importorg.springframework.stereotype.Component;
?
/**
* fastjson解析
*/
@Component
publicclassJsonTest3{
?
/**
* 對象轉(zhuǎn)json
* @param user
* @return
*/
publicStringuserToJson(Useruser){
Stringjson=JSONObject.toJSONString(user);
returnjson;
?? }
?
/**
* json轉(zhuǎn)對象
* @param json
* @return
*/
publicUseruserFromJson(Stringjson){
Useruser=JSONObject.parseObject(json,User.class);
returnuser;
?? }
?
}
Jackson 解析
這個解析方式是在目前我們使用最流行的一些框架比如 SSM、SpringBoot弹惦,其內(nèi)部的 json 解析使用的就是 Jackson,但往往我們會另外引入 FastJson 來使用悄但,因為速度更快棠隐。
第一步,引入依賴:
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
第二步檐嚣,編寫測試代碼:
packageorg.example;
?
importcom.fasterxml.jackson.core.JsonProcessingException;
importcom.fasterxml.jackson.databind.ObjectMapper;
importorg.springframework.stereotype.Component;
?
importjava.io.IOException;
?
/**
* jackson解析
*/
@Component
publicclassJsonTest4{
?
/**
* 對象轉(zhuǎn)json
* @param user
* @return
*/
publicStringuserToJson(Useruser)throwsJsonProcessingException{
ObjectMapperobjectMapper=newObjectMapper();
Stringjson=objectMapper.writeValueAsString(user);
returnjson;
?? }
?
/**
* json轉(zhuǎn)對象
* @param json
* @return
*/
publicUseruserFromJson(Stringjson)throwsIOException{
ObjectMapperobjectMapper=newObjectMapper();
Useruser=objectMapper.readValue(json,User.class);
returnuser;
?? }
?
}
擴展~JSON的誕生
JSON 的誕生是因為 XML 整合到 HTML 中各個瀏覽器實現(xiàn)的細節(jié)不盡相同助泽,所以道格拉斯·克羅克福特(Douglas Crockford)和 奇普·莫寧斯達(Chip Morningstar)一起從 JS 的數(shù)據(jù)類型中提取了一個子集,作為新的數(shù)據(jù)交換格式嚎京,因為主流的瀏覽器使用了通用的 JavaScript 引擎組件嗡贺,所以在解析這種新數(shù)據(jù)格式時就不存在兼容性問題,于是他們將這種數(shù)據(jù)格式命名為 “JavaScript Object Notation”鞍帝,縮寫為 JSON诫睬,由此 JSON 便誕生了!