java中對(duì)象和JSON格式的轉(zhuǎn)換方法代碼
JSON
JSON(javaScript Object Notation)
是一種輕量級(jí)的數(shù)據(jù)交換格式,具有良好的可讀性和可拓展性。
它采用鍵值對(duì)的方式表示數(shù)據(jù),支持基本數(shù)據(jù)類(lèi)型和復(fù)合數(shù)據(jù)類(lèi)型??捎糜诿枋鼋Y(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù)。
結(jié)構(gòu)
對(duì)象結(jié)構(gòu)(無(wú)序):
無(wú)序的對(duì)象結(jié)構(gòu)在不同語(yǔ)言中稱(chēng)法不同
對(duì)象(object):一個(gè)對(duì)象包含一系列非排序的鍵/值對(duì),一個(gè)對(duì)象以 {
開(kāi)始,并以 }
結(jié)束。每個(gè)鍵/值對(duì)之間使用 :
分區(qū)。多個(gè)鍵值對(duì)之間通過(guò) ,
分割。
數(shù)組結(jié)構(gòu)(有序):
有序的的數(shù)組結(jié)構(gòu)。將數(shù)組作為有序數(shù)組進(jìn)行轉(zhuǎn)換
JSON
,就可以得到有序的JSON
數(shù)組結(jié)構(gòu)
數(shù)組:一個(gè)數(shù)組包含一系列排序的鍵/值對(duì),一個(gè)對(duì)象以 [
開(kāi)始,并以 ]
結(jié)束。每個(gè)鍵/值對(duì)之間使用 :
分區(qū)。多個(gè)鍵值對(duì)之間通過(guò) ,
分割。
tips:
- 需要注意的是
JSON
的鍵是一個(gè)String
類(lèi)型的字符串。 - 值(value):可以是雙引號(hào)括起來(lái)的
字符串(string)
、數(shù)值(number)
、true
、false
、null
、對(duì)象(object)
或者數(shù)組(array)
。這些結(jié)構(gòu)可以嵌套使用。 JSON
格式不支持注釋?zhuān)易址仨毷褂秒p引號(hào)""
,而不是 單引號(hào)。JSON
格式可以使用一些轉(zhuǎn)義字符
JSON在java中的使用
Java中并沒(méi)有內(nèi)置
JSON
的解析,因此使用JSON
需要借助第三方類(lèi)庫(kù)。
java
中常見(jiàn)的解析 json
的第三方庫(kù)(jar包):
- -
JSON官方
- -
GSON
- -
FastJson
- -
Jackson 2
- -
hutool-json
每種方式生成和解析進(jìn)行闡述
1.使用JSON官方提供的JSON
官方提供的JSON
具有通用性,就是解析時(shí)有點(diǎn)費(fèi)事。
maven依賴(lài):
<dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20180130</version> </dependency>
生成JSON
對(duì)象1.使用JSONObject
添加對(duì)象
代碼:
@Test public void Test3(){ //創(chuàng)建JSON對(duì)象 JSONObject jsonObject = new JSONObject(); Object obj = null; //像JSON對(duì)象中添加數(shù)據(jù) jsonObject.put("name", "張三"); jsonObject.put("age", 20); jsonObject.put("birth", "1998-01-01"); jsonObject.put("haveCar", obj); jsonObject.put("hasGirlfriend", true); jsonObject.put("likes", new String[]{"看電影", "看書(shū)"}); //將JSON對(duì)象以字符串的形式打印 System.out.println(jsonObject.toString()); }
結(jié)果:
在字符串輸出的時(shí)候會(huì)發(fā)現(xiàn),輸出的字符串與數(shù)據(jù)存儲(chǔ)的順序可能是不一致的。原因是調(diào)用jsonObject.put()
方法的時(shí)候,其底層是一個(gè) HashMap
,數(shù)據(jù)被存到了HashMap
中。 HashMap
根據(jù)鍵的哈希碼來(lái)決定鍵的位置,所以可能會(huì)出現(xiàn)上面的問(wèn)題。
2.javaBean轉(zhuǎn)JSON
javaBean:
public class User { private String name; private int age; private String[] likes; // 省略 get 與 set 方法 }
JavaBean TO JSON:
public static void beanToJsonTest() { User user = new User(); user.setName("張三"); user.setAge(20); user.setLikes(new String[]{"看電影", "看書(shū)"}); JSONObject jsonObject = new JSONObject(user); System.out.println(jsonObject.toString()); }
解析JSON
首先有兩張表,分別是學(xué)生表和年級(jí)表,年紀(jì)和學(xué)生是一對(duì)多關(guān)系
//JSON字符串 String json = "{'id':1,'name':'JAVAEE-1703','stus':[{'id':101,'name':'劉一','age':16},{'id':102,'name':'劉二','age':23}]}"; //將JSON字符串轉(zhuǎn)為JSON對(duì)象 JSONObject jsonObject = JSONObject.fromObject(json); //創(chuàng)建年級(jí)對(duì)象,然后進(jìn)行解析JSON,并賦值 Grade grade = new Grade(); grade.setId(jsonObject.getInt("id")); grade.setName(jsonObject.getString("name")); //創(chuàng)建一個(gè)集合用來(lái)存儲(chǔ)學(xué)生對(duì)象 ArrayList<Student> students = new ArrayList<>(); JSONArray stus = jsonObject.getJSONArray("stus"); //遍歷JSONArray對(duì)象,解析后放入集合中 for (Object o : stus) { JSONObject jsonObject1 = JSONObject.fromObject(o); Student student = new Student(jsonObject1.getInt("id"),jsonObject1.getString("name"), jsonObject1.getInt("age")); students.add(student); } grade.setStus(students) ; //至此一個(gè)JSON字符串解析為Java對(duì)象
2.使用GSON
maven依賴(lài):
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.2</version> </dependency>
生成JSON對(duì)象:
public static void beanToJsonTest() { User user = new User(); user.setName("張三"); user.setAge(20); user.setLike(new String[]{"看電影", "看書(shū)"}); /** * 使用GsonBuilder 可以作一些額外處理,比如格式化輸出,預(yù)處理等 * * GsonBuilder gsonBuilder = new GsonBuilder(); * gsonBuilder.setPrettyPrinting(); * Gson gson = gsonBuilder.create(); */ Gson gson = new Gson(); System.out.println(gson.toJson(user)); }
解析JSON
public static void jsonToBeanTest() { String jsonStr = "{\"name\":\"李四\",\"age\":22 , \"like\":[\"看電影\",\"看書(shū)\"],\"birth\":\"1996-01-01\"}"; GsonBuilder gsonBuilder = new GsonBuilder(); // 設(shè)置日期轉(zhuǎn)換格式 gsonBuilder.setDateFormat("yyyy-MM--dd"); Gson gson = gsonBuilder.create(); //解析對(duì)象:第一個(gè)參數(shù):待解析的字符串 第二個(gè)參數(shù)結(jié)果數(shù)據(jù)類(lèi)型的Class對(duì)象 User user = gson.fromJson(jsonStr, User.class); }
3.使用FastJSON
FastJSON
是阿里巴巴的產(chǎn)品,效率最高,深受廣大程序員的喜愛(ài)
maven依賴(lài):
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency>
生成JSON對(duì)象:創(chuàng)建JSON
對(duì)象非常簡(jiǎn)單,只需使用 JSONObject
(fastJson提供的json對(duì)象
) 和 JSONArray
(fastJson提供json數(shù)組對(duì)象
) 對(duì)象即可。
@Test public void whenGenerateJson_thanGenerationCorrect() throws ParseException { JSONArray jsonArray = new JSONArray(); for (int i = 0; i < 2; i++) { JSONObject jsonObject = new JSONObject(); jsonObject.put("AGE", 10); jsonObject.put("FULL NAME", "Doe " + i); jsonObject.put("DATE OF BIRTH", "2016/12/12 12:12:12"); jsonArray.add(jsonObject); } // jsonString --> obj //String[] strings = JSON.parseObject(str, String[].class); // System.out.println(Arrays.toString(strings)); // obj --> jsonString String jsonOutput = jsonArray.toJSONString(); }
解析JSON
@Test public void whenJson_thanConvertToObjectCorrect() { Person person = new Person(20, "John", "Doe", new Date()); String jsonObject = JSON.toJSONString(person); Person newPerson = JSON.parseObject(jsonObject, Person.class);
JSON 對(duì)象與字符串的相互轉(zhuǎn)化最常用的就是這個(gè)直接轉(zhuǎn)化了,來(lái)吧:
//從字符串解析JSON對(duì)象 JSONObject obj = JSON.parseObject("{\"runoob\":\"菜鳥(niǎo)教程\"}"); //從字符串解析JSON數(shù)組 JSONArray arr = JSON.parseArray("[\"菜鳥(niǎo)教程\",\"RUNOOB\"]\n"); //將JSON對(duì)象轉(zhuǎn)化為字符串 String objStr = JSON.toJSONString(obj); //將JSON數(shù)組轉(zhuǎn)化為字符串 String arrStr = JSON.toJSONString(arr);
4.使用JackSon
jackSon解析JSON,SpringMVC內(nèi)置的解析器就是這個(gè)
maven依賴(lài):
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.8</version> </dependency>
生成JSON字符串
ArrayList<Student> students = new ArrayList<>(); for (int i = 0; i < 3; i++) { students.add(new Student(100 + i, "二稿" + i, 1000 + i)); } Grade grade = new Grade(22, "語(yǔ)文", students); ObjectMapper objectMapper = new ObjectMapper(); String s = objectMapper.writeValueAsString(grade); System.out.println(s);
解析JSON字符串
// 對(duì)象嵌套數(shù)組嵌套對(duì)象 String json1 = "{\"id\":1,\"name\":\"JAVAEE-1703\",\"stus\":[{\"id\":101,\"name\":\"劉一\",\"age\":16}]}"; // 數(shù)組 String json2 = "[\"北京\",\"天津\",\"杭州\"]"; ObjectMapper mapper = new ObjectMapper(); Grade grade = mapper.readValue(json1, Grade.class); System.out.println(grade); List<String> list = mapper.readValue(json2, newTypeReference<List<String>>() {}); System.out.println(list)
5、hutool-json
maven依賴(lài):
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.0.6</version> </dependency>
字符串 轉(zhuǎn) JSONObject
String jsonStr = "{\"DispositionNotificationListObject\":{\"DispositionNotificationObject\":[{\"PersonObject\":{\"GenderCode\":0,\"EthicCode\":0,\"DeviceID\":\"0\",\"SourceID\":\"022019121117052900016\",\"SubImageList\":{\"SubImageInfoObject\":[{\"Type\":\"11\",\"StoragePath\":\"xxx\",\"DeviceID\":\"0\",\"ImageID\":\"022019121117052900016\",\"EventSort\":0,\"ShotTime\":\"19700119134716\",\"Height\":-1,\"FileFormat\":\"jpg\",\"Width\":-1},{\"Type\":\"11\",\"StoragePath\":\"xxx\",\"DeviceID\":\"0\",\"ImageID\":\"022019121117052900016\",\"EventSort\":0,\"ShotTime\":\"19700119134600\",\"Height\":-1,\"FileFormat\":\"jpg\",\"Width\":-1},{\"Type\":\"14\",\"StoragePath\":\"xxx\",\"DeviceID\":\"0\",\"ImageID\":\"022019121117052900016\",\"EventSort\":0,\"ShotTime\":\"19700119134600\",\"Height\":-1,\"FileFormat\":\"jpg\",\"Width\":-1}]},\"LeftTopY\":141,\"LeftTopX\":104,\"Name\":\"圖片姓名測(cè)試\",\"InfoKind\":1,\"PersonID\":\"0220191211170529000180100019\",\"RightBtmY\":806,\"RightBtmX\":932,\"IDNumber\":\"\"},\"NotificationID\":\"202002031736\",\"DispositionID\":\"71\",\"TriggerTime\":\"2020-02-03 15:34:15\",\"Title\":\"第三方1400告警信息接收測(cè)試\"}]}}"; JSONObject json = new JSONObject(jsonStr);
解析 JSONObject:
1)獲取對(duì)象
JSONObject dispositionNotificationListObject = json.getJSONObject("DispositionNotificationListObject");
2)獲取單值
String alertPersonName = personObject.getStr("Name"); Integer eventSort = subImageInfoObject.getInt("EventSort");
字符串 轉(zhuǎn) JSONArray
String jsonArrayStr = "[{\"Type\":\"11\",\"StoragePath\":\"http://192.168.166.203:11180/storage/v1/image/global?cluster_id=ShenSi&uri_base64=bm9ybWFsOi8vcmVwb3NpdG9yeS1idWlsZGVyLzIwMjAwMTIwL1ZRQnV1LVlsWFpGd29lN1dJSnlXUmc9PUAx\",\"DeviceID\":\"0\",\"ImageID\":\"022019121117052900016\",\"EventSort\":0,\"ShotTime\":\"19700119134716\",\"Height\":-1,\"FileFormat\":\"jpg\",\"Width\":-1},{\"Type\":\"11\",\"StoragePath\":\"http://192.168.166.203:11180/storage/v1/image/global?cluster_id=ShenSi&uri_base64=bm9ybWFsOi8vcmVwb3NpdG9yeS1idWlsZGVyLzIwMjAwMTIwL0gzc1dYN3lXRmh1Zmd0Sjd6Tlo1cnc9PUAx\",\"DeviceID\":\"0\",\"ImageID\":\"022019121117052900016\",\"EventSort\":0,\"ShotTime\":\"19700119134600\",\"Height\":-1,\"FileFormat\":\"jpg\",\"Width\":-1},{\"Type\":\"14\",\"StoragePath\":\"http://192.168.166.203:11180/storage/v1/image/global?cluster_id=ShenSi&uri_base64=bm9ybWFsOi8vcmVwb3NpdG9yeS1idWlsZGVyLzIwMjAwMTIwL0JXS3RIQm1aVXpUT3prNzJOYW50S1E9PUAx\",\"DeviceID\":\"0\",\"ImageID\":\"022019121117052900016\",\"EventSort\":0,\"ShotTime\":\"19700119134600\",\"Height\":-1,\"FileFormat\":\"jpg\",\"Width\":-1}]"; JSONArray jsonArray = new JSONArray(jsonArrayStr);
解析 JSONArray:
1)獲取數(shù)組對(duì)象
JSONArray subImageInfoObjectList = subImageList.getJSONArray("SubImageInfoObject");
2)獲取單值
for(int j=0; j< jsonArray.size(); j++){ JSONObject subImageInfoObject = jsonArray.getJSONObject(j); String Type = subImageInfoObject.getStr("Type"); Integer width = subImageInfoObject.getInt("Width"); System.out.println(Type); }
tips:
此時(shí),我們深克隆實(shí)現(xiàn)就有三種了:
- 自定義 clone 實(shí)現(xiàn) 【麻煩死了】
- 將引用數(shù)據(jù)類(lèi)型的字段也克隆一份
- 使用序列化實(shí)現(xiàn)
- 將對(duì)象序列化為字節(jié)流,再反序列化為對(duì)象
- 通過(guò)JSON
,使用第三方庫(kù)實(shí)現(xiàn) 【推薦】
- 使用第三方庫(kù)實(shí)現(xiàn)深克隆,比如:GSON、FastJson、Jackson 2、hutool-json
總結(jié)
到此這篇關(guān)于java中對(duì)象和JSON格式的轉(zhuǎn)換方法的文章就介紹到這了,更多相關(guān)java對(duì)象和JSON格式轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java對(duì)象轉(zhuǎn)JSON三種常用的方法
- Java中如何使用Gson將對(duì)象轉(zhuǎn)換為JSON字符串
- 如何將Java對(duì)象轉(zhuǎn)換成JSON
- java中對(duì)象轉(zhuǎn)json字符串的幾種常用方式舉例
- java中json和對(duì)象之間相互轉(zhuǎn)換的運(yùn)用
- 詳解JSON與?Java對(duì)象之間的轉(zhuǎn)化
- 如何將Java對(duì)象轉(zhuǎn)換為JSON實(shí)例詳解
- Java如何將String轉(zhuǎn)換成json對(duì)象或json數(shù)組
- java中對(duì)象轉(zhuǎn)json字符串的三種常用方式
相關(guān)文章
MyBatis注解式開(kāi)發(fā)映射語(yǔ)句詳解
這幾年來(lái)注解開(kāi)發(fā)越來(lái)越流行,Mybatis也可以使用注解開(kāi)發(fā)方式,這樣我們就可以減少編寫(xiě)Mapper映射文件了。我們先圍繞一些基本的CRUD來(lái)學(xué)習(xí),再學(xué)習(xí)復(fù)雜映射多表操作2023-02-02spring cloud內(nèi)容匯總(各個(gè)功能模塊、啟動(dòng)、部署)的詳細(xì)過(guò)程
Spring Cloud 是一套基于 Spring Boot 的框架集合,用于構(gòu)建分布式微服務(wù)架構(gòu),文章介紹了Spring Cloud框架及其相關(guān)工具的使用,還詳細(xì)介紹了如何配置和使用這些功能,包括配置文件、依賴(lài)管理以及實(shí)際應(yīng)用示例,感興趣的朋友一起看看吧2024-11-11Java虛擬機(jī)JVM優(yōu)化實(shí)戰(zhàn)的過(guò)程全記錄
有人說(shuō)Java之所以能夠崛起,JVM功不可沒(méi)。Java虛擬機(jī)最初服務(wù)于讓Java語(yǔ)言凌駕于平臺(tái)之上,實(shí)現(xiàn)“編寫(xiě)一次,到處運(yùn)行”,那么下面這篇文章主要給大家分享了個(gè)關(guān)于Java虛擬機(jī)JVM優(yōu)化實(shí)戰(zhàn)的過(guò)程全記錄,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-08-08Quarkus中filter過(guò)濾器跨域cors問(wèn)題解決方案
這篇文章主要為大家介紹了Quarkus中filter過(guò)濾器跨域cors問(wèn)題的解決方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-02-02springboot如何使用@ConfigurationProperties封裝配置文件
springboot如何使用@ConfigurationProperties封裝配置文件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Spring Transaction事務(wù)實(shí)現(xiàn)流程源碼解析
此文就Spring 事務(wù)實(shí)現(xiàn)流程進(jìn)行源碼解析,我們可以借此對(duì)Spring框架更多一層理解,下面以xml形式創(chuàng)建一個(gè)事務(wù)進(jìn)行分析2022-09-09