使用Jackson进行json转对象,对象转json总结
生活随笔
收集整理的這篇文章主要介紹了
使用Jackson进行json转对象,对象转json总结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
背景
在前后端分離的項目中,后端經常涉及到json與對象互轉的場景。阿里巴巴的Fastjson是好用,但是,因為技術領導的原因(可能因為fastjson1的各種問題很多吧),不讓用,所以就需要選擇其他技術棧。當前比較常用的是SpringBoot自帶的Jackson或者谷歌的Gson。
下面,做一下使用Jackson的總結。
JavaBean準備
json字符串和對象互轉
對象轉json字符串
不管你是什么結構的對象,想轉json,直接objectMapper.writeValueAsString()搞定。
/*** 序列化:對象轉json字符串,包含多個數組**/@Testpublic void testObject2Json2() {User user2 = new User("1","上海辟謠專屬隊","職業辟謠,不信謠,不傳謠,呵呵");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":"上海辟謠專屬隊","password":"職業辟謠,不信謠,不傳謠,呵呵"}]}]}json字符串轉對象
注意:這種情形是json對象字符串,不能是json數組字符串,后面會說到。
@Testpublic void testJson2Object() {String json = "{\"companyName\":\"yyyyyy\",\"webSites\":[" +"{\"webSiteName\":\"xxxxxx.com\",\"users\":[{\"userId\":\"1\",\"username\":\"上海辟謠專屬隊\",\"password\":\"職業辟謠,不信謠,不傳謠,呵呵\"}]}" +"]}";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);}}輸出:
上海辟謠專屬隊json數組字符串和數組(集合)對象互轉
有個大坑
數組對象轉json數組字符串
/*** 序列化:數組對象轉json數組類型的字符串**/@Testpublic void testObjectArray2JsonArrayString() {User user1 = new User("1","上海帶刀滬衛","帶刀大佬");User user2 = new User("1","上海辟謠專屬隊","職業辟謠,不信謠,不傳謠,呵呵");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":"上海帶刀滬衛","password":"帶刀大佬"},{"userId":"1","username":"上海辟謠專屬隊","password":"職業辟謠,不信謠,不傳謠,呵呵"}]json數組字符串轉數組對象
先演示一下錯誤的寫法,先演示一下錯誤的寫法,先演示一下錯誤的寫法,重要的事情說三遍!
/*** 反序列化:數組類型的json字符串轉對象數組**/@Testpublic void testJsonArrayString2ObjectArray() {String json = "[" +"{\"userId\":\"1\",\"username\":\"上海帶刀滬衛\",\"password\":\"帶刀大佬\"}" +",{\"userId\":\"1\",\"username\":\"上海辟謠專屬隊\",\"password\":\"職業辟謠,不信謠,不傳謠,呵呵\"}" +"]";ObjectMapper objectMapper = new ObjectMapper();try {//錯誤寫法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因為實際轉成了map類型,所以使用List方式取值是錯的!
正確做法:
最終輸出:
上海帶刀滬衛 上海辟謠專屬隊同時,對多層嵌套的數組也適用:
@Testpublic void testJsonArrayString2ObjectArray2() {String json = "[" +"{" +"\"companyName\":\"yyyyyy\",\"webSites\":[" +"{\"webSiteName\":\"xxxxxx.com\",\"users\":[" +"{\"userId\":\"1\",\"username\":\"上海辟謠專屬隊\",\"password\":\"職業辟謠,不信謠,不傳謠,呵呵\"}" +"]" +"}" +"]" +"}" +"]";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);}}總結
以上是在項目中常用的,當然還有一些小弟沒有用過的,希望各位大佬分享一下!
總結
以上是生活随笔為你收集整理的使用Jackson进行json转对象,对象转json总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 初入职场的工作感悟
- 下一篇: 为什么空格拷贝到linux 会变成两个