Java如何將json字符串與實(shí)體類互相轉(zhuǎn)換
01.概述
如果我們接收到的是一個(gè)json字符串,我們?cè)撊绾螌?duì)該字符串進(jìn)行解析?
- 方式一:使用實(shí)體類進(jìn)行解析
- 方式二:使用map進(jìn)行解析
使用的依賴jar包:fastjson
compile('com.alibaba:fastjson:1.2.xx')
02.對(duì)json字符串進(jìn)行解析
使用實(shí)體類進(jìn)行解析
創(chuàng)建一個(gè)用于接收的實(shí)體類:使用json字符串中的那些字段,實(shí)體類的屬性值一定要和JSON串中的key
對(duì)應(yīng)
假設(shè)JSON字符串如下:
"{\"bornTime\":\"2022-09-30 19:48:59\",\"userName\":\"AISMALL\",\"sex\":\"man\",\"age\":18}"
對(duì)應(yīng)的實(shí)體類屬性就應(yīng)該定義成如下的樣子:
public class PersonInfoDto { private Date bornTime; private String userName; private String sex; private Integer age; public Date getBornTime() { return bornTime; } public void setBornTime(Date bornTime) { this.bornTime = bornTime; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "PersonInfoDto{" + "bornTime=" + bornTime + ", userName='" + userName + '\'' + ", sex='" + sex + '\'' + ", age=" + age + '}'; } }
代碼示例:
public class test01 { public static void main(String[] args) { String jsonStr = "{\"bornTime\":\"2022-09-30 19:48:59\",\"userName\":\"AISMALL\",\"sex\":\"man\",\"age\":18}"; PersonInfoDto personInfoDto = JSONObject.parseObject(jsonStr, PersonInfoDto.class); System.out.println(personInfoDto.toString()); } }
運(yùn)行結(jié)果:
PersonInfoDto{bornTime=Fri Sep 30 19:48:59 CST 2022, userName='AISMALL', sex='man', age=18}
使用實(shí)體類解析拓展
public class test01 { public static void main(String[] args) { // json串里面的key與實(shí)體類字段匹配幾個(gè)就會(huì)賦值幾個(gè),匹配不上的賦值為null String jsonStr1 ="{\"bornTime\":\"2022-09-30 19:48:59\"}"; PersonInfoDto personInfoDto1 = JSONObject.parseObject(jsonStr1, PersonInfoDto.class); System.out.println("personInfoDto1: " + personInfoDto1); // json串中出現(xiàn)重復(fù)的字段,就會(huì)使用后者進(jìn)行覆蓋 String jsonStr2 ="{\"bornTime\":\"2022-09-30 19:48:59\",\"userName\":\"AISMALL\",\"userName\":\"AISMALL2\"}"; PersonInfoDto personInfoDto2 = JSONObject.parseObject(jsonStr2, PersonInfoDto.class); System.out.println("personInfoDto2: " + personInfoDto2); // json串里面的key與實(shí)體類字段匹配幾個(gè)就會(huì)賦值幾個(gè),不管該傳有多長(zhǎng),只取匹配到的key的value給實(shí)體類賦值 String jsonStr3 ="{\"bornTime\":\"2022-09-30 19:48:59\",\"userName\":\"AISMALL\",\"sex\":\"man\",\"age\":18,\"age2\":18}"; PersonInfoDto personInfoDto3 = JSONObject.parseObject(jsonStr3,PersonInfoDto.class); System.out.println("personInfoDto3: " + personInfoDto3); // 剛好對(duì)應(yīng)的情況 String jsonStr4="{\"bornTime\":\"2022-09-30 19:48:59\",\"userName\":\"AISMALL\",\"sex\":\"man\",\"age\":18}"; PersonInfoDto personInfoDto4 = JSONObject.parseObject(jsonStr4, PersonInfoDto.class); System.out.println("personInfoDto4: " + personInfoDto4); } }
運(yùn)行結(jié)果:
personInfoDto1: PersonInfoDto{bornTime=Fri Sep 30 19:48:59 CST 2022, userName='null', sex='null', age=null}
personInfoDto2: PersonInfoDto{bornTime=Fri Sep 30 19:48:59 CST 2022, userName='AISMALL2', sex='null', age=null}
personInfoDto3: PersonInfoDto{bornTime=Fri Sep 30 19:48:59 CST 2022, userName='AISMALL', sex='man', age=18}
personInfoDto4: PersonInfoDto{bornTime=Fri Sep 30 19:48:59 CST 2022, userName='AISMALL', sex='man', age=18}
小結(jié)
- json串里面的key與實(shí)體類字段匹配幾個(gè)就會(huì)賦值幾個(gè),不管該傳有多長(zhǎng),只取匹配到的key的value給實(shí)體類賦值,匹配不上的賦值為null。
- json串中出現(xiàn)重復(fù)的字段,就會(huì)使用后者進(jìn)行覆蓋。
使用map進(jìn)行解析
public class test01 { public static void main(String[] args) { // json字符串 String jsonStr = "{\"age\":18,\"sex\":\"man1\",\"userName\":\"AISMALL1\"}"; //====================方式一============================== Map maps = (Map)JSON.parse(jsonStr); for (Object map : maps.entrySet()) { System.out.println(((Map.Entry)map).getKey()+": " + ((Map.Entry)map).getValue()); } //====================方式二============================== Map mapTypes =JSON.parseObject(jsonStr); for(Object obj :mapTypes.keySet()){ System.out.println("key: " + obj + " value: " + mapTypes.get(obj)); } //====================方式三============================== Map mapType = JSON.parseObject(jsonStr, Map.class); System.out.println("這個(gè)是用JSON類,指定解析類型,來(lái)解析JSON字符串!!!"); for(Object obj :mapType.keySet()){ System.out.println("key: " + obj + " value: " + mapType.get(obj)); } //====================方式四============================== Map json =(Map)JSONObject.parse(jsonStr); //用Json對(duì)象解析成Map類型 for (Object map : json.entrySet()){ System.out.println(((Map.Entry)map).getKey() + ": "+((Map.Entry)map).getValue()); } //====================方式五============================== JSONObject jsonobject = JSONObject.parseObject(jsonStr); for(Object map:jsonobject.entrySet()){ System.out.println(((Map.Entry)map).getKey()+": "+((Map.Entry)map).getValue()); } } }
03.Map和json字符串的互相轉(zhuǎn)換
3.1.json字符串轉(zhuǎn)換為Map
參考:使用map進(jìn)行解析
3.2.Map轉(zhuǎn)換為json字符串
public class test01 { public static void main(String[] args) { // 創(chuàng)建一個(gè)Hashmap Map<String, Object> paraMap = new HashMap(); paraMap.put("userName","AISMALL"); paraMap.put("sex","man"); paraMap.put("age",18); // 方式一:轉(zhuǎn)換為json字符串 String jsonStr = JSONObject.toJSONString(paraMap); System.out.println("jsonStr: " + jsonStr); // 方式二:轉(zhuǎn)換為json字符串 String jsonStr2 = Json.toJson(paraMap); System.out.println("jsonStr2: " + jsonStr2); } }
運(yùn)行結(jié)果:
jsonStr: {"sex":"man","userName":"AISMALL","age":18}
jsonStr2: {"sex":"man","userName":"AISMALL","age":18}
04.json操作的一些小技巧
4.1.json字符轉(zhuǎn)換為實(shí)體類
前面已經(jīng)介紹了:
JSONObject.parseObject(jsonString, PersonInfoDto .class);
4.2.實(shí)體類轉(zhuǎn)json字符串
public class test01 { public static void main(String[] args) { Date date = new Date(); // 創(chuàng)建一個(gè)Date對(duì)象,獲取當(dāng)前時(shí)間 SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 指定格式化格式 f.format(date); // 將當(dāng)前時(shí)間袼式化為指定的格式 PersonInfoDto personInfoDto = new PersonInfoDto(); personInfoDto.setBornTime(date); personInfoDto.setUserName("AISMALL"); personInfoDto.setSex("man"); personInfoDto.setAge(18); String jsonStr = JSON.toJSONString(personInfoDto); System.out.println(jsonStr); } }
運(yùn)行結(jié)果:
{"age":18,"bornTime":1665113383685,"sex":"man","userName":"AISMALL"}
4.3.json字符串轉(zhuǎn)換為json對(duì)象
public class test01 { public static void main(String[] args) { // json字符串 String jsonStr = "{\"test\":\"test\",\"Result\":[{\"Result1\":\"Result1\",\"Detail1\":\"Detail1\"},{\"Result2\":\"Result2\",\"Detail2\":\"Detail2\"},{\"Result3\":\"Result3\",\"Detail3\":\"Detail3\"}]}"; // json字符串轉(zhuǎn)換為jsonObject JSONObject jSONObject = JSONObject.parseObject(jsonStr); System.out.println(jSONObject); // 根據(jù)Key取出Json對(duì)象中的值 String testStr = jSONObject.getString("test"); System.out.println("testStr: " + testStr); } }
運(yùn)行結(jié)果:
{"test":"test","Result":[{"Detail1":"Detail1","Result1":"Result1"},{"Detail2":"Detail2","Result2":"Result2"},{"Detail3":"Detail3","Result3":"Result3"}]}
testStr: test
注意:
- Json對(duì)象和Json字符串的區(qū)別在于,
Json對(duì)象(JSONObject)
里面有很多定義好的方法可以幫助我們根據(jù)Key取出Json對(duì)象中的值,后面我們也會(huì)演示幾個(gè)JSONObject提供的方法。
4.4.json對(duì)象轉(zhuǎn)換為json字符串
public class test01 { public static void main(String[] args) { // json字符串 String jsonStr = "{\"test\":\"test\",\"Result\":[{\"Detail1\":\"Detail1\",\"Result1\":\"Result1\"},{\"Detail2\":\"Detail2\",\"Result2\":\"Result2\"},{\"Detail3\":\"Detail3\",\"Result3\":\"Result3\"}]}"; // json字符串轉(zhuǎn)換為jsonObject JSONObject jSONObject = JSONObject.parseObject(jsonStr); // json對(duì)象轉(zhuǎn)換為json字符串 String jsonObjectConv = JSON.toJSONString(jSONObject); System.out.println(jsonObjectConv); } }
運(yùn)行結(jié)果:
{"test":"test","Result":[{"Detail1":"Detail1","Result1":"Result1"},{"Detail2":"Detail2","Result2":"Result2"},{"Detail3":"Detail3","Result3":"Result3"}]}
4.5.json字符串?dāng)?shù)組轉(zhuǎn)換json數(shù)組
注意:json字符串?dāng)?shù)組,即String是JSONArray格式的字符串
public class test01 { public static void main(String[] args) { // json字符串?dāng)?shù)組 String jsonArr = "[{\"Detail1\":\"Detail1\",\"Result1\":\"Result1\"},{\"Detail2\":\"Detail2\",\"Result2\":\"Result2\"},{\"Detail3\":\"Detail3\",\"Result3\":\"Result3\"}]"; JSONArray jsonArray= JSONArray.parseArray(jsonArr); // 轉(zhuǎn)換成Json字符串?dāng)?shù)組之后,就可以遍歷了,字符串是無(wú)法遍歷的 for (Object jsonStr:jsonArray) { System.out.println(jsonStr); } } }
運(yùn)行結(jié)果:
{"Detail1":"Detail1","Result1":"Result1"}
{"Detail2":"Detail2","Result2":"Result2"}
{"Detail3":"Detail3","Result3":"Result3"}
4.6.List<實(shí)體類>轉(zhuǎn)json數(shù)組
public class test01 { public static void main(String[] args) { PersonInfoDto personInfoDto1 = new PersonInfoDto(); personInfoDto1.setUserName("AISMALL1"); personInfoDto1.setSex("man1"); personInfoDto1.setAge(18); PersonInfoDto personInfoDto2 = new PersonInfoDto(); personInfoDto2.setUserName("AISMALL2"); personInfoDto2.setSex("man2"); personInfoDto2.setAge(19); List<PersonInfoDto> list = new ArrayList<>(); list.add(personInfoDto1); list.add(personInfoDto2); // 轉(zhuǎn)換為json字符串 String jsonStr = JSONObject.toJSONString(list); System.out.println("jsonStr: " + jsonStr); // json字符串轉(zhuǎn)換為json數(shù)組 JSONArray jsonArray= JSONArray.parseArray(jsonStr); // 轉(zhuǎn)換成Json字符串?dāng)?shù)組之后,就可以遍歷了,字符串是無(wú)法遍歷的 for (Object jsonStr1:jsonArray) { System.out.println(jsonStr1); } } }
運(yùn)行結(jié)果:
jsonStr: [{"age":18,"sex":"man1","userName":"AISMALL1"},{"age":19,"sex":"man2","userName":"AISMALL2"}]
{"sex":"man1","userName":"AISMALL1","age":18}
{"sex":"man2","userName":"AISMALL2","age":19}
4.7.json數(shù)組轉(zhuǎn)List<實(shí)體類>
public class test01 { public static void main(String[] args) { // json字符串?dāng)?shù)組 String jsonStr = "[{\"age\":18,\"sex\":\"man1\",\"userName\":\"AISMALL1\"},{\"age\":19,\"sex\":\"man2\",\"userName\":\"AISMALL2\"}]"; System.out.println("jsonStr: " + jsonStr); // json字符串轉(zhuǎn)換為json數(shù)組 JSONArray jsonArray= JSONArray.parseArray(jsonStr); List<PersonInfoDto> personInfoDtoList = jsonArray.toJavaList(PersonInfoDto.class); for (PersonInfoDto personInfoDto:personInfoDtoList) { System.out.println("personInfoDto: " + personInfoDto); } } }
運(yùn)行結(jié)果:
jsonStr: [{"age":18,"sex":"man1","userName":"AISMALL1"},{"age":19,"sex":"man2","userName":"AISMALL2"}]
personInfoDto: PersonInfoDto{bornTime=null, userName='AISMALL1', sex='man1', age=18}
personInfoDto: PersonInfoDto{bornTime=null, userName='AISMALL2', sex='man2', age=19}
05.josnObject操作的一些小技巧
JSONObject如下:
{ "test": "test", "Result": [ { "Result1": "Result1", "Detail1": "Detail1" }, { "Result2": "Result2", "Detail2": "Detail2" }, { "Result3": "Result3", "Detail3": "Detail3" } ] }
5.1.JSONObject中的數(shù)組提取為JSONArray
public class test01 { public static void main(String[] args) { // json字符串 String jsonStr = "{\"test\":\"test\",\"Result\":[{\"Result1\":\"Result1\",\"Detail1\":\"Detail1\"},{\"Result2\":\"Result2\",\"Detail2\":\"Detail2\"},{\"Result3\":\"Result3\",\"Detail3\":\"Detail3\"}]}"; // json字符串轉(zhuǎn)換為jsonObject JSONObject jSONObject = JSONObject.parseObject(jsonStr); // 獲取里面的Json字符串?dāng)?shù)組 JSONArray jsonArray = jSONObject.getJSONArray("Result"); // 轉(zhuǎn)換成Json字符串?dāng)?shù)組之后,就可以遍歷了,字符串是無(wú)法遍歷的 for (Object jsonStr2:jsonArray) { System.out.println(jsonStr2); } } }
運(yùn)行結(jié)果
[{"Detail1":"Detail1","Result1":"Result1"},{"Detail2":"Detail2","Result2":"Result2"},{"Detail3":"Detail3","Result3":"Result3"}]
5.2.JSONObject獲取value
public class test01 { public static void main(String[] args) { // json字符串 String jsonStr = "{\"test\":\"test\",\"Result\":[{\"Result1\":\"Result1\",\"Detail1\":\"Detail1\"},{\"Result2\":\"Result2\",\"Detail2\":\"Detail2\"},{\"Result3\":\"Result3\",\"Detail3\":\"Detail3\"}]}"; // json字符串轉(zhuǎn)換為jsonObject JSONObject jSONObject = JSONObject.parseObject(jsonStr); // 返回值為String類型 String testStr = jSONObject.getString("test"); System.out.println("testStr: " + testStr); // 返回值為Object類型 Object testObject = jSONObject.get("Result"); System.out.println("testObject: " + testObject); } }
運(yùn)行結(jié)果:
testStr: test
testObject: [{"Detail1":"Detail1","Result1":"Result1"},{"Detail2":"Detail2","Result2":"Result2"},{"Detail3":"Detail3","Result3":"Result3"}]
06.總結(jié)
更多方法可以去查看JSONArray
,JSONObject
的源碼。
到此這篇關(guān)于Java如何將json字符串與實(shí)體類互相轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)json字符串與實(shí)體類互相轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java任務(wù)調(diào)度的常見(jiàn)實(shí)現(xiàn)方法與比較詳解
這篇文章主要介紹了Java任務(wù)調(diào)度的常見(jiàn)實(shí)現(xiàn)方法與比較,結(jié)合實(shí)例形式分析了Java任務(wù)調(diào)度的四種常見(jiàn)實(shí)現(xiàn)方法,使用區(qū)別及相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-08-08java多線程應(yīng)用實(shí)現(xiàn)方法
以前沒(méi)有寫(xiě)筆記的習(xí)慣,現(xiàn)在慢慢的發(fā)現(xiàn)及時(shí)總結(jié)是多么的重要了,呵呵。雖然才大二,但是也快要畢業(yè)了,要加油2012-11-11java?啟動(dòng)參數(shù)?springboot?idea詳解
這篇文章主要介紹了java?啟動(dòng)參數(shù)?springboot?idea的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09Spring 使用 feign時(shí)設(shè)置header信息的操作
這篇文章主要介紹了Spring 使用 feign時(shí)設(shè)置header信息的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Spring boot實(shí)現(xiàn)文件上傳實(shí)例(多文件上傳)
本篇文章主要介紹了Spring boot實(shí)現(xiàn)文件上傳實(shí)例(多文件上傳),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05Java中的MapStruct知識(shí)點(diǎn)總結(jié)
這篇文章主要介紹了Java中的MapStruct知識(shí)點(diǎn)總結(jié),MapStruct是一個(gè)Java注解處理器,用于生成類型安全的映射代碼,它可以自動(dòng)處理源對(duì)象和目標(biāo)對(duì)象之間的映射,減少了手動(dòng)編寫(xiě)重復(fù)的映射代碼的工作量,需要的朋友可以參考下2023-10-10