日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用Jackson进行json转对象,对象转json总结

發布時間:2023/12/10 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Jackson进行json转对象,对象转json总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

背景

在前后端分離的項目中,后端經常涉及到json與對象互轉的場景。阿里巴巴的Fastjson是好用,但是,因為技術領導的原因(可能因為fastjson1的各種問題很多吧),不讓用,所以就需要選擇其他技術棧。當前比較常用的是SpringBoot自帶的Jackson或者谷歌的Gson。
下面,做一下使用Jackson的總結。

JavaBean準備

  • Company,公司
  • @Data @NoArgsConstructor @AllArgsConstructor public class Company {private String companyName;private List<WebSite> webSites; }
  • WebSite,站點
  • @Data @NoArgsConstructor @AllArgsConstructor public class WebSite {private String webSiteName;private List<User> users;}
  • User,用戶
  • @Data @NoArgsConstructor @AllArgsConstructor public class User {private String userId;private String username;private String password; }

    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方式取值是錯的!
    正確做法:

    /*** 反序列化:數組類型的json字符串轉對象數組**/@Testpublic void testJsonArrayString2ObjectArray() {String json = "[" +"{\"userId\":\"1\",\"username\":\"上海帶刀滬衛\",\"password\":\"帶刀大佬\"}" +",{\"userId\":\"1\",\"username\":\"上海辟謠專屬隊\",\"password\":\"職業辟謠,不信謠,不傳謠,呵呵\"}" +"]";ObjectMapper objectMapper = new ObjectMapper();try {TypeReference<List<User>> typeReference = new TypeReference<List<User>>() {};List<User> list = objectMapper.readValue(json, typeReference);list.forEach(user -> {System.out.println(user.getUsername());});} catch (JsonProcessingException e) {log.error("error: ", e);}}

    最終輸出:

    上海帶刀滬衛 上海辟謠專屬隊

    同時,對多層嵌套的數組也適用:

    @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总结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。