使用Jackson进行json转对象,对象转json总结
背景
在前后端分離的項(xiàng)目中,后端經(jīng)常涉及到j(luò)son與對(duì)象互轉(zhuǎn)的場(chǎng)景。阿里巴巴的Fastjson是好用,但是,因?yàn)榧夹g(shù)領(lǐng)導(dǎo)的原因(可能因?yàn)閒astjson1的各種問(wèn)題很多吧),不讓用,所以就需要選擇其他技術(shù)棧。當(dāng)前比較常用的是SpringBoot自帶的Jackson或者谷歌的Gson。
下面,做一下使用Jackson的總結(jié)。
JavaBean準(zhǔn)備
json字符串和對(duì)象互轉(zhuǎn)
對(duì)象轉(zhuǎn)json字符串
不管你是什么結(jié)構(gòu)的對(duì)象,想轉(zhuǎn)json,直接objectMapper.writeValueAsString()搞定。
/*** 序列化:對(duì)象轉(zhuǎn)json字符串,包含多個(gè)數(shù)組**/@Testpublic void testObject2Json2() {User user2 = new User("1","上海辟謠專屬隊(duì)","職業(yè)辟謠,不信謠,不傳謠,呵呵");List<User> users = new ArrayList<>();users.add(user2);WebSite webSite = new WebSite();webSite.setWebSiteName("xxxxxx.com");webSite.setUsers(users);List<WebSite> webSites = new ArrayList<>();webSites.add(webSite);Company company = new Company();company.setCompanyName("yyyyyy");company.setWebSites(webSites);ObjectMapper objectMapper = new ObjectMapper();try {String jsonString = objectMapper.writeValueAsString(company);System.out.println(jsonString);} catch (JsonProcessingException e) {log.error("error: ", e);}}輸出:
{"companyName":"yyyyyy","webSites":[{"webSiteName":"xxxxxx.com","users":[{"userId":"1","username":"上海辟謠專屬隊(duì)","password":"職業(yè)辟謠,不信謠,不傳謠,呵呵"}]}]}json字符串轉(zhuǎn)對(duì)象
注意:這種情形是json對(duì)象字符串,不能是json數(shù)組字符串,后面會(huì)說(shuō)到。
@Testpublic void testJson2Object() {String json = "{\"companyName\":\"yyyyyy\",\"webSites\":[" +"{\"webSiteName\":\"xxxxxx.com\",\"users\":[{\"userId\":\"1\",\"username\":\"上海辟謠專屬隊(duì)\",\"password\":\"職業(yè)辟謠,不信謠,不傳謠,呵呵\"}]}" +"]}";ObjectMapper objectMapper = new ObjectMapper();try {Company company = objectMapper.readValue(json, Company.class);System.out.println(company.getWebSites().get(0).getUsers().get(0).getUsername());} catch (JsonProcessingException e) {log.error("error: ", e);}}輸出:
上海辟謠專屬隊(duì)json數(shù)組字符串和數(shù)組(集合)對(duì)象互轉(zhuǎn)
有個(gè)大坑
數(shù)組對(duì)象轉(zhuǎn)json數(shù)組字符串
/*** 序列化:數(shù)組對(duì)象轉(zhuǎn)json數(shù)組類型的字符串**/@Testpublic void testObjectArray2JsonArrayString() {User user1 = new User("1","上海帶刀滬衛(wèi)","帶刀大佬");User user2 = new User("1","上海辟謠專屬隊(duì)","職業(yè)辟謠,不信謠,不傳謠,呵呵");List<User> users = new ArrayList<>();users.add(user1);users.add(user2);ObjectMapper objectMapper = new ObjectMapper();try {String json = objectMapper.writeValueAsString(users);System.out.println(json);} catch (JsonProcessingException e) {log.error("error: ", e);}}輸出:
[{"userId":"1","username":"上海帶刀滬衛(wèi)","password":"帶刀大佬"},{"userId":"1","username":"上海辟謠專屬隊(duì)","password":"職業(yè)辟謠,不信謠,不傳謠,呵呵"}]json數(shù)組字符串轉(zhuǎn)數(shù)組對(duì)象
先演示一下錯(cuò)誤的寫(xiě)法,先演示一下錯(cuò)誤的寫(xiě)法,先演示一下錯(cuò)誤的寫(xiě)法,重要的事情說(shuō)三遍!
/*** 反序列化:數(shù)組類型的json字符串轉(zhuǎn)對(duì)象數(shù)組**/@Testpublic void testJsonArrayString2ObjectArray() {String json = "[" +"{\"userId\":\"1\",\"username\":\"上海帶刀滬衛(wèi)\",\"password\":\"帶刀大佬\(zhòng)"}" +",{\"userId\":\"1\",\"username\":\"上海辟謠專屬隊(duì)\",\"password\":\"職業(yè)辟謠,不信謠,不傳謠,呵呵\"}" +"]";ObjectMapper objectMapper = new ObjectMapper();try {//錯(cuò)誤寫(xiě)法List<User> list = objectMapper.readValue(json, List.class);list.forEach(user -> {System.out.println(user.getUsername());});} catch (JsonProcessingException e) {log.error("error: ", e);}}輸出異常:
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.xywei.springboot.springtestdemo.entity.Userat java.util.ArrayList.forEach(ArrayList.java:1259)at com.xywei.springboot.springtestdemo.junit.TestUseJackson.testJsonArrayString2ObjectArray(TestUseJackson.java:160)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688)at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)at #省略大段…… Process finished with exit code -1因?yàn)閷?shí)際轉(zhuǎn)成了map類型,所以使用List方式取值是錯(cuò)的!
正確做法:
最終輸出:
上海帶刀滬衛(wèi) 上海辟謠專屬隊(duì)同時(shí),對(duì)多層嵌套的數(shù)組也適用:
@Testpublic void testJsonArrayString2ObjectArray2() {String json = "[" +"{" +"\"companyName\":\"yyyyyy\",\"webSites\":[" +"{\"webSiteName\":\"xxxxxx.com\",\"users\":[" +"{\"userId\":\"1\",\"username\":\"上海辟謠專屬隊(duì)\",\"password\":\"職業(yè)辟謠,不信謠,不傳謠,呵呵\"}" +"]" +"}" +"]" +"}" +"]";ObjectMapper objectMapper = new ObjectMapper();try {TypeReference<List<Company>> typeReference = new TypeReference<List<Company>>() {};List<Company> list = objectMapper.readValue(json, typeReference);list.forEach(company -> {System.out.println(company.getWebSites().get(0).getUsers().get(0).getUsername());});} catch (JsonProcessingException e) {log.error("error: ", e);}}總結(jié)
以上是在項(xiàng)目中常用的,當(dāng)然還有一些小弟沒(méi)有用過(guò)的,希望各位大佬分享一下!
總結(jié)
以上是生活随笔為你收集整理的使用Jackson进行json转对象,对象转json总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 初入职场的工作感悟
- 下一篇: CE修改器使用教程 [入门篇]