背景

在前后端分离的项目中,后端经常涉及到json与对象互转的场景。阿里巴巴的Fastjson是好用,但是,因为技术领导的原因(可能因为fastjson1的各种问题很多吧),不让用,所以就需要选择其他技术栈。当前比较常用的是SpringBoot自带的Jackson或者谷歌的Gson。
下面,做一下使用Jackson的总结。

JavaBean准备

  1. Company,公司
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Company {private String companyName;private List<WebSite> webSites;
}
  1. WebSite,站点
@Data
@NoArgsConstructor
@AllArgsConstructor
public class WebSite {private String webSiteName;private List<User> users;}
  1. 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总结相关推荐

  1. Jackson:数组json字符串转对象集合(List)的两种方式

    首先,创建个实体类Person import java.util.List;public class Person {private String name;private Integer age;p ...

  2. jackson json转对象 对象转json

    一,Jackson使用示例 第1步:创建ObjectMapper对象. 创建ObjectMapper对象.它是一个可重复使用的对象. ObjectMapper mapper = new ObjectM ...

  3. FastJson、Jackson、Gson进行Java对象转换Json的细节处理

    前言 Java对象在转json的时候,如果对象里面有属性值为null的话,那么在json序列化的时候要不要序列出来呢?对比以下json转换方式 一.fastJson 1.fastJson在转换java ...

  4. gson转对象变成null_FastJson、Jackson、Gson进行Java对象转换Json的细节处理

    转 https://blog.csdn.net/moneyshi/article/details/51830329 Java对象转换Json的细节处理 前言 Java对象在转json的时候,如果对象里 ...

  5. Jackson学习二之集合类对象与JSON互相转化--转载

    原文地址:http://lijingshou.iteye.com/blog/2003059 本篇主要演示如何使用Jackson对List, Map和数组与JSON互相转换. package com.j ...

  6. 总结的一些json格式和对象/String/Map/List等的互转工具类

    总结的一些json格式和对象/String/Map/List等的互转工具类,有需要的可以看看,需要引入jackson-core-asl-1.7.1.jar.jackson-jaxrs-1.7.1.ja ...

  7. Spring Boot整合Spring Data Redis-存取JSON格式Java对象

    如何通过Spring Data Redis,以JSON格式来存储我们的实体对象,其实上节课我们讲了基于JDK的序列化器,来帮助我们做一个序列化,做一个对象的存储,那么这种方式需要注意一点的是,如果我们 ...

  8. 把对象转换成JSON字符串 第二稿支持移动设备

    /*** 导入jackson包 把对象转换成JSON字符串 第二稿 支持移动设备* @param pn* @param request* @return*/@RequestMapping(value ...

  9. Json字符串和对象相互转换

    文章目录 1.JsonUtil 工具类 把对象转换为json字符串 把json字符串转换为对象 把json字符串转换为List集合 2.Gson 把对象转换为json字符串 把json字符串转换为对象 ...

  10. JSON字符串和对象之间的转换

    使用jackSON来实现JSON字符串和对象之间的转换 引入maven <!--jackson--><dependency><groupId>com.fasterx ...

最新文章

  1. 隐藏画质代码_「图」画质修改工具ReShade放出4.5.0更新:改进对Vulkan等较新API的支持...
  2. C语言中最常用标准库
  3. selenium python_Python+Selenium基础入门及实践
  4. docker启动后自动退出_Spring Boot项目启动后如何自动执行逻辑
  5. Spring Cloud Config 规范
  6. getActionBar()报空指针异常
  7. MySQL时间段查询,无数据补0
  8. python des加密文件_python DES3 加密解密
  9. Visual Studio 2013 (CV版)编译错误【error C4996: 'sprintf': This function or variable may be unsafe. 】的解决方案
  10. 从 DCG 到 IDCG 再到 NDCG
  11. TypeScript学习日记
  12. 一个超好看的音乐网站设计与实现(HTML+CSS)
  13. 网站快速成型工具-Element UI
  14. android6.0屏蔽home键,android 禁用home键
  15. 计算机怎么查询隐藏的字体,Win10怎么隐藏不使用的字体?隐藏字体的方法
  16. JAVA PrinterJob 指定打印机
  17. 计算机音乐数字乐谱fade,电鼓垫24数字曲谱大全集
  18. 关于前端上传文件到七牛云的一些笔记
  19. 基于SSM框架的社区在线就诊系统
  20. 中国环保机械市场现状调研与未来投资方向预测报告2022-2028年

热门文章

  1. Python纯代码pdf批量快速转换成ppt
  2. android 设置类PreferenceActivity
  3. php源码 学校版 cms,S-CMS学校建站系统PHP源码(含小程序) v5.0 bulid20201126
  4. 活著就为改变世界---史蒂夫.乔布斯…
  5. 小米 MIUI 12 Magisk root教程(无需刷REC)
  6. 自定义View:悬浮球与加速球
  7. 怪物猎人online 日服 注册流程(原创)
  8. kafka报org.apache.kafka.common.errors.RecordTooLargeException
  9. 花生壳5.0 for Linux使用教程
  10. 台服DNF修改Script.pvf文件修改黑钻抽奖机的道具爆率,图文详解