Java如何將json字符串與實(shí)體類(lèi)互相轉(zhuǎn)換
01.概述
如果我們接收到的是一個(gè)json字符串,我們?cè)撊绾螌?duì)該字符串進(jìn)行解析?
- 方式一:使用實(shí)體類(lèi)進(jìn)行解析
- 方式二:使用map進(jìn)行解析
使用的依賴(lài)jar包:fastjson
compile('com.alibaba:fastjson:1.2.xx')
02.對(duì)json字符串進(jìn)行解析
使用實(shí)體類(lèi)進(jìn)行解析
創(chuàng)建一個(gè)用于接收的實(shí)體類(lèi):使用json字符串中的那些字段,實(shí)體類(lèi)的屬性值一定要和JSON串中的key對(duì)應(yīng)
假設(shè)JSON字符串如下:
"{\"bornTime\":\"2022-09-30 19:48:59\",\"userName\":\"AISMALL\",\"sex\":\"man\",\"age\":18}"
對(duì)應(yīng)的實(shí)體類(lèi)屬性就應(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í)體類(lèi)解析拓展
public class test01 {
public static void main(String[] args) {
// json串里面的key與實(shí)體類(lèi)字段匹配幾個(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í)體類(lèi)字段匹配幾個(gè)就會(huì)賦值幾個(gè),不管該傳有多長(zhǎng),只取匹配到的key的value給實(shí)體類(lèi)賦值
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í)體類(lèi)字段匹配幾個(gè)就會(huì)賦值幾個(gè),不管該傳有多長(zhǎng),只取匹配到的key的value給實(shí)體類(lèi)賦值,匹配不上的賦值為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),指定解析類(lèi)型,來(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類(lèi)型
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í)體類(lèi)
前面已經(jīng)介紹了:
JSONObject.parseObject(jsonString, PersonInfoDto .class);
4.2.實(shí)體類(lèi)轉(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í)體類(lèi)>轉(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í)體類(lèi)>
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類(lèi)型
String testStr = jSONObject.getString("test");
System.out.println("testStr: " + testStr);
// 返回值為Object類(lèi)型
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í)體類(lèi)互相轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)json字符串與實(shí)體類(lèi)互相轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決MybatisPlus批量插入數(shù)據(jù)報(bào)錯(cuò):Error getting generated 
在使用MybatisPlus進(jìn)行批量插入數(shù)據(jù)時(shí)遇到空指針異常錯(cuò)誤,分析原因是由于主鍵生成策略導(dǎo)致的,嘗試通過(guò)設(shè)置useGeneratedKeys屬性解決問(wèn)題,但因批量插入方法限制,該方法未能成功,最終通過(guò)自定義mapper方法實(shí)現(xiàn)批量插入,解決了問(wèn)題2024-09-09
代碼詳解Java猴子選王問(wèn)題(約瑟夫環(huán))
本篇文章通過(guò)實(shí)例給大家分析了java約瑟夫環(huán)這個(gè)經(jīng)典內(nèi)容,有興趣的跟著小編一起學(xué)習(xí)下吧。2018-02-02
idea?Maven?插件?docker-maven-plugin?打包docker鏡像上傳到遠(yuǎn)程倉(cāng)庫(kù)的過(guò)程詳解
這篇文章主要介紹了idea Maven插件docker-maven-plugin打包docker鏡像上傳到遠(yuǎn)程倉(cāng)庫(kù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
Java利用cors實(shí)現(xiàn)跨域請(qǐng)求實(shí)例
本篇文章主要介紹了Java利用cors實(shí)現(xiàn)跨域請(qǐng)求實(shí)例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
java開(kāi)源調(diào)度如何給xxljob加k8s執(zhí)行器
這篇文章主要介紹了java開(kāi)源調(diào)度如何給xxljob加一個(gè)k8s執(zhí)行器,?xxljob?在設(shè)計(jì)上,抽象出了執(zhí)行器的接口,所以實(shí)現(xiàn)一個(gè)語(yǔ)言的執(zhí)行器并不復(fù)雜,這里主要探索下,如何利用k8s的pod?的能力,使用?xxljob?調(diào)度?pod?運(yùn)行,實(shí)現(xiàn)一個(gè)通用的和語(yǔ)言無(wú)關(guān)的執(zhí)行器2022-02-02
java可以作為第一門(mén)編程語(yǔ)言學(xué)習(xí)嗎
在本篇內(nèi)容里小編給JAVA零基礎(chǔ)的網(wǎng)友分享一篇關(guān)于java可以作為第一門(mén)編程語(yǔ)言學(xué)習(xí)嗎的文章,有興趣的朋友們可以參考下。2020-11-11

