java中對象和JSON格式的轉(zhuǎn)換
JSON
JSON(javaScript Object Notation)
是一種輕量級的數(shù)據(jù)交換格式,具有良好的可讀性和可拓展性。
它采用鍵值對的方式表示數(shù)據(jù),支持基本數(shù)據(jù)類型和復(fù)合數(shù)據(jù)類型??捎糜诿枋鼋Y(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù)。
結(jié)構(gòu)
對象結(jié)構(gòu)(無序):
無序的對象結(jié)構(gòu)在不同語言中稱法不同
對象(object):一個對象包含一系列非排序的鍵/值對
,一個對象以 {
開始,并以 }
結(jié)束。每個鍵/值對之間使用 :
分區(qū)。多個鍵值對之間通過 ,
分割。
數(shù)組結(jié)構(gòu)(有序):
有序的的數(shù)組結(jié)構(gòu)。將數(shù)組作為有序數(shù)組進(jìn)行轉(zhuǎn)換
JSON
,就可以得到有序的JSON
數(shù)組結(jié)構(gòu)
數(shù)組:一個數(shù)組包含一系列排序的鍵/值對
,一個對象以 [
開始,并以 ]
結(jié)束。每個鍵/值對之間使用 :
分區(qū)。多個鍵值對之間通過 ,
分割。
tips:
- 需要注意的是
JSON
的鍵是一個String
類型的字符串。 - 值(value):可以是雙引號括起來的
字符串(string)
、數(shù)值(number)
、true
、false
、null
、對象(object)
或者數(shù)組(array)
。這些結(jié)構(gòu)可以嵌套使用。 -
JSON
格式不支持注釋,且字符串必須使用雙引號""
,而不是 單引號。 -
JSON
格式可以使用一些轉(zhuǎn)義字符
JSON在java中的使用
Java中并沒有內(nèi)置
JSON
的解析,因此使用JSON
需要借助第三方類庫。
java
中常見的解析 json
的第三方庫(jar包):
- -
JSON官方
- -
GSON
- -
FastJson
- -
Jackson 2
- -
hutool-json
每種方式生成和解析進(jìn)行闡述
1.使用JSON
官方提供的JSON
官方提供的JSON
具有通用性,就是解析時有點費事。
maven依賴:
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20180130</version>
</dependency>
生成JSON
對象
1.使用JSONObject
添加對象
代碼:
@Test
public void Test3(){
//創(chuàng)建JSON對象
JSONObject jsonObject = new JSONObject();
Object obj = null;
//像JSON對象中添加數(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[]{"看電影", "看書"});
//將JSON對象以字符串的形式打印
System.out.println(jsonObject.toString());
}
結(jié)果:
在字符串輸出的時候會發(fā)現(xiàn),輸出的字符串與數(shù)據(jù)存儲的順序可能是不一致的。原因是調(diào)用jsonObject.put()
方法的時候,其底層是一個 HashMap
,數(shù)據(jù)被存到了HashMap
中。 HashMap
根據(jù)鍵的哈希碼來決定鍵的位置,所以可能會出現(xià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[]{"看電影", "看書"});
JSONObject jsonObject = new JSONObject(user);
System.out.println(jsonObject.toString());
}
解析JSON
首先有兩張表,分別是學(xué)生表和年級表,年紀(jì)和學(xué)生是一對多關(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對象
JSONObject jsonObject = JSONObject.fromObject(json);
//創(chuàng)建年級對象,然后進(jìn)行解析JSON,并賦值
Grade grade = new Grade();
grade.setId(jsonObject.getInt("id"));
grade.setName(jsonObject.getString("name"));
//創(chuàng)建一個集合用來存儲學(xué)生對象
ArrayList<Student> students = new ArrayList<>();
JSONArray stus = jsonObject.getJSONArray("stus");
//遍歷JSONArray對象,解析后放入集合中
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) ;
//至此一個JSON字符串解析為Java對象
2.使用GSON
maven依賴:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency>
生成JSON對象:
public static void beanToJsonTest() {
User user = new User();
user.setName("張三");
user.setAge(20);
user.setLike(new String[]{"看電影", "看書"});
/**
* 使用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\":[\"看電影\",\"看書\"],\"birth\":\"1996-01-01\"}";
GsonBuilder gsonBuilder = new GsonBuilder();
// 設(shè)置日期轉(zhuǎn)換格式
gsonBuilder.setDateFormat("yyyy-MM--dd");
Gson gson = gsonBuilder.create();
//解析對象:第一個參數(shù):待解析的字符串 第二個參數(shù)結(jié)果數(shù)據(jù)類型的Class對象
User user = gson.fromJson(jsonStr, User.class);
}
3.使用FastJSON
FastJSON
是阿里巴巴的產(chǎn)品,效率最高,深受廣大程序員的喜愛
maven依賴:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
生成JSON對象:
創(chuàng)建JSON
對象非常簡單,只需使用 JSONObject
(fastJson提供的json對象
) 和 JSONArray
(fastJson提供json數(shù)組對象
) 對象即可。
@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 對象與字符串的相互轉(zhuǎn)化
最常用的就是這個直接轉(zhuǎn)化了,來吧:
//從字符串解析JSON對象
JSONObject obj = JSON.parseObject("{\"runoob\":\"菜鳥教程\"}");
//從字符串解析JSON數(shù)組
JSONArray arr = JSON.parseArray("[\"菜鳥教程\",\"RUNOOB\"]\n");
//將JSON對象轉(zhuǎn)化為字符串
String objStr = JSON.toJSONString(obj);
//將JSON數(shù)組轉(zhuǎn)化為字符串
String arrStr = JSON.toJSONString(arr);
4.使用JackSon
jackSon解析JSON,SpringMVC內(nèi)置的解析器就是這個
maven依賴:
<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, "語文", students);
ObjectMapper objectMapper = new ObjectMapper();
String s = objectMapper.writeValueAsString(grade);
System.out.println(s);
解析JSON字符串
// 對象嵌套數(shù)組嵌套對象
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依賴:
<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\":\"圖片姓名測試\",\"InfoKind\":1,\"PersonID\":\"0220191211170529000180100019\",\"RightBtmY\":806,\"RightBtmX\":932,\"IDNumber\":\"\"},\"NotificationID\":\"202002031736\",\"DispositionID\":\"71\",\"TriggerTime\":\"2020-02-03 15:34:15\",\"Title\":\"第三方1400告警信息接收測試\"}]}}";
JSONObject json = new JSONObject(jsonStr);
解析 JSONObject:
1)獲取對象
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ù)組對象
JSONArray subImageInfoObjectList = subImageList.getJSONArray("SubImageInfoObject");
2)獲取單值文章來源:http://www.zghlxwxcb.cn/news/detail-759408.html
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:
此時,我們深克隆實現(xiàn)就有三種了:
- 自定義 clone 實現(xiàn) 【麻煩死了】
- 將引用數(shù)據(jù)類型的字段也克隆一份
- 使用序列化實現(xiàn)
- 將對象序列化為字節(jié)流,再反序列化為對象
- 通過JSON
,使用第三方庫實現(xiàn) 【推薦】
- 使用第三方庫實現(xiàn)深克隆,比如:GSON、FastJson、Jackson 2、hutool-json
文章來源地址http://www.zghlxwxcb.cn/news/detail-759408.html
到了這里,關(guān)于java中對象和JSON格式的轉(zhuǎn)換的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!