java json转换
https://blog.csdn.net/WillJGL/article/details/77866224
SpringBoot中如果需要实现json的序列化和反序列化,我们会使用json解析工具。一般用到的有fastjson、GSON、Jackson
根据网上的测试,Jackson性能好一些,而且Jackson是SpringBoot默认引用的
本文记录SpringBoot如何使用Jackson
准备
1、在项目中创建包Jackson
2、分别创建4各类文件
2.1、Company实体类(里面包含Department的list)
2.2、Department实体类
2.3、jsonController controller类,接收测试请求
2.4、JsonHelper Jackson操作类
如题所示
每个类内容如下
Company
import java.util.ArrayList;
import java.util.List;
public class Company {
private String name;
private String address;
private int employeesCount;
private List<Department> departmentArrayList;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getEmployeesCount() {
return employeesCount;
}
public void setEmployeesCount(int employeesCount) {
this.employeesCount = employeesCount;
}
public List<Department> getDepartmentArrayList() {
return departmentArrayList;
}
public void setDepartmentArrayList(List<Department> departmentArrayList) {
this.departmentArrayList = departmentArrayList;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
Department
public class Department {
private String name;
private int employeesCount;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getEmployeesCount() {
return employeesCount;
}
public void setEmployeesCount(int employeesCount) {
this.employeesCount = employeesCount;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
jsonController
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JavaType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.*;
@RestController
@RequestMapping("/json")
public class jsonController {
private final Logger logger = LoggerFactory.getLogger(this.getClass());//对象方式初始化Log对象
@GetMapping("")
public String index() throws Exception {
JsonHelper jm = new JsonHelper();
//1、对象<->Json
//准备数据
Company c = getCompany();
//对象转Json
String json = jm.toJson(c);
logger.info("1.1、对象转Json="+json);
//Json转对象
Company obj = jm.fromJson(json,Company.class);
logger.info("1.2、Json转对象="+ obj.getDepartmentArrayList().get(0).getName());
//2、Map<->Json
//Json转Map
Map map = jm.fromJson(json,Map.class);
List<Map> tempList = (List<Map>)map.get("departmentArrayList");
logger.info("2.1、Json转Map="+tempList.get(0).get("name"));
//Map转Json
json = jm.toJson(map);
logger.info("2.2、Map转Json="+json);
//3、List<Object> <->Json
//准备数据
List<Company> companyList = new ArrayList<Company>();
companyList.add(getCompany());
companyList.add(getCompany());
companyList.add(getCompany());
//List<Object>转Json
json = jm.toJson(companyList);
logger.info("3.1、List<Object>转Json="+json);
//Json转List<Object>
List<Company> companyListDecode = jm.fromJson(json,new TypeReference<List<Company>>() {});
logger.info("3.2、Json转List<Object>="+companyListDecode.get(0).getDepartmentArrayList().get(0).getName());
//4、Map<String, Object><-> Json
//准备数据
Map<String, Company> map1 = new HashMap<String, Company>() ;
map1.put("1",getCompany());
map1.put("2",getCompany());
map1.put("3",getCompany());
//Map<String, Object>转Json
json = jm.toJson(map1);
logger.info("4.1、Map<String, Object>转Json="+json);
//Json转Map<String, Object>
Map<String, Company> map1Decode = jm.fromJson(json,new TypeReference<Map<String, Company>>() {});
logger.info("4.2、Json转Map<String, Object>="+map1Decode.get("1").getDepartmentArrayList().get(0).getName());
//5、List<Map<String, Object>><->Json
//准备数据
List<Map<String, Company>> listMap =new ArrayList<Map<String, Company>>();
Map<String, Company> map2 = new HashMap<String, Company>() ;
map2.put("a",getCompany());
map2.put("b",getCompany());
map2.put("c",getCompany());
listMap.add(map1);
listMap.add(map2);
//List<Map<String, Object>> 转Json
json = jm.toJson(listMap);
logger.info("5.1、List<Map<String, Object>> 转Json="+json);
//Json 转 List<Map<String, Object>>
List<Map<String, Company>> listMapDecode = jm.fromJson(json,new TypeReference<List<Map<String, Company>>>() {});
logger.info("5.2、List<Map<String, Object>> 转Json="+listMapDecode.get(0).get("1").getDepartmentArrayList().get(0).getName());
return "";
}
private Company getCompany()
{
long time = new Date().getTime();
String sTime = String.valueOf(time);
Company c = new Company();
c.setEmployeesCount(10);
c.setName("公司名"+sTime);
List list = new ArrayList();
Department d1= new Department();
d1.setEmployeesCount(5);
d1.setName("部门1"+sTime);
Department d2= new Department();
d2.setEmployeesCount(5);
d2.setName("部门2"+sTime);
list.add(d1);
list.add(d2);
c.setDepartmentArrayList(list);
return c;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
JsonHelper
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.util.JSONPObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
public class JsonHelper {
private Logger logger = LoggerFactory.getLogger(this.getClass());
ObjectMapper mapper;
public JsonHelper()
{
mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
public JsonHelper(JsonInclude.Include include)
{
mapper = new ObjectMapper();
mapper.setSerializationInclusion(include);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
public String toJson(Object object) throws JsonProcessingException {
return mapper.writeValueAsString(object);
}
public <T> T fromJson(String json, Class<T> cls) throws IOException {
return mapper.readValue(json, cls);
}
public <T> T fromJson(String json,TypeReference valueTypeRef) throws IOException {
return mapper.readValue(json, valueTypeRef);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
转换方式
共举例如下几种转换方式(整体在jsonController文件中,这里分别拆出来说明)
对象<->Json
//1、对象<->Json
//准备数据
Company c = getCompany();
//对象转Json
String json = jm.toJson(c);
logger.info("1.1、对象转Json="+json);
//Json转对象
Company obj = jm.fromJson(json,Company.class);
logger.info("1.2、Json转对象="+ obj.getDepartmentArrayList().get(0).getName());
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
Map<->Json
//2、Map<->Json
//Json转Map
Map map = jm.fromJson(json,Map.class);
List<Map> tempList = (List<Map>)map.get("departmentArrayList");
logger.info("2.1、Json转Map="+tempList.get(0).get("name"));
//Map转Json
json = jm.toJson(map);
logger.info("2.2、Map转Json="+json);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
List<Object> <->Json
//3、List<Object> <->Json
//准备数据
List<Company> companyList = new ArrayList<Company>();
companyList.add(getCompany());
companyList.add(getCompany());
companyList.add(getCompany());
//List<Object>转Json
json = jm.toJson(companyList);
logger.info("3.1、List<Object>转Json="+json);
//Json转List<Object>
List<Company> companyListDecode = jm.fromJson(json,new TypeReference<List<Company>>() {});
logger.info("3.2、Json转List<Object>="+companyListDecode.get(0).getDepartmentArrayList().get(0).getName());
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
Map<String, Object><-> Json
//4、Map<String, Object><-> Json
//准备数据
Map<String, Company> map1 = new HashMap<String, Company>() ;
map1.put("1",getCompany());
map1.put("2",getCompany());
map1.put("3",getCompany());
//Map<String, Object>转Json
json = jm.toJson(map1);
logger.info("4.1、Map<String, Object>转Json="+json);
//Json转Map<String, Object>
Map<String, Company> map1Decode = jm.fromJson(json,new TypeReference<Map<String, Company>>() {});
logger.info("4.2、Json转Map<String, Object>="+map1Decode.get("1").getDepartmentArrayList().get(0).getName());
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
List<Map<String, Object>><->Json
//5、List<Map<String, Object>><->Json
//准备数据
List<Map<String, Company>> listMap =new ArrayList<Map<String, Company>>();
Map<String, Company> map2 = new HashMap<String, Company>() ;
map2.put("a",getCompany());
map2.put("b",getCompany());
map2.put("c",getCompany());
listMap.add(map1);
listMap.add(map2);
//List<Map<String, Object>> 转Json
json = jm.toJson(listMap);
logger.info("5.1、List<Map<String, Object>> 转Json="+json);
//Json 转 List<Map<String, Object>>
List<Map<String, Company>> listMapDecode = jm.fromJson(json,new TypeReference<List<Map<String, Company>>>() {});
logger.info("5.2、List<Map<String, Object>> 转Json="+listMapDecode.get(0).get("1").getDepartmentArrayList().get(0).getName());
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
测试
访问controller的方法,查看日志可以看出来每种转换都可以成功转为json,也可以成功转为对象
其它特性
在有些时候,我们会希望进行一些特殊处理,例如json不
忽略字段
@JsonIgnore 进行JSON操作时忽略该属性。
对于实体类中,如果有某个字段不希望参与json序列化与反序列化,可以把属性标记为@JsonIgnore
例如Company这个类
如果我们给Name、Address、employeesCount三个属性赋值了,序列化出来的内容是
{
"name": "公司名1504688970821",
"address": "地址",
"employeesCount": 10
}
- 1
- 2
- 3
- 4
- 5
如果employeesCount是一个内容计数的值,不希望参与序列化,我们可以标记它
@JsonIgnore
private int employeesCount;
- 1
- 2
这样再次序列化的结果就变为了
{
"name": "公司名1504689048950",
"address": "地址"
}
- 1
- 2
- 3
- 4
处理时间类型
@JsonFormat(pattern = “yyyy年MM月dd日”) 时间格式化
我们在Company实体类增加一个Date类型的属性,并且赋值序列化
private Date createDate;
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
赋值然后再序列化,得到的内容是
{
"name": "公司名1504689283756",
"address": "地址",
"createDate": 1504689283756
}
- 1
- 2
- 3
- 4
- 5
可以看到时间是一个数字
我们标记这个属性,再次序列化
{
"name": "公司名1504689362487",
"address": "地址",
"createDate": "2017年09月06日"
}
- 1
- 2
- 3
- 4
- 5
时间按照指定的格式显示了
更改字段序列化名
@JsonProperty(“newName”) 改字段名
默认情况下,字段名是什么,序列化出来的key值也就是什么,如果我们希望序列化出来的名字和字段名不一样,则需要使用这个标记
我们把Company的name标记为newName
@JsonProperty("newName")
private String name;
- 1
- 2
然后进行序列化
{
"address": "地址",
"createDate": "2017年09月06日",
"newName": "公司名1504689496978"
}
- 1
- 2
- 3
- 4
- 5
可以看出来,结果出来的key就使用了自定义的名字
java json转换的更多相关文章
- java json转换工具类
在java项目中,通常会用到json类型的转换,常常需要对 json字符串和对象进行相互转换. 在制作自定义的json转换类之前,先引入以下依赖 <!--json相关工具--><de ...
- java json转换(一)
主要使用了2个类 JsonConvert.class 和 ConvertHelper.class 由于常规转json.只要model牵涉到复杂的关联实体对象.那么就会出现 深度循环的错误. 因此这里通 ...
- java json转换(二)
package com.kps.common.utils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArra ...
- java json 转换
1.直接输出: 2.字符串 通过eval转换输出,里面涉及到一个转义问题,还要注意eval的用法里面需要加"("+ + ")" 3.
- Java对象转换成xml对象和Java对象转换成JSON对象
1.把Java对象转换成JSON对象 apache提供的json-lib小工具,它可以方便的使用Java语言来创建JSON字符串.也可以把JavaBean转换成JSON字符串. json-lib的核心 ...
- FastJson、Jackson、Gson进行Java对象转换Json细节处理
前言 Java对象在转json的时候,如果对象里面有属性值为null的话,那么在json序列化的时候要不要序列出来呢?对比以下json转换方式 一.fastJson 1.fastJson在转换java ...
- FastJson、Jackson、Gson进行Java对象转换Json的细节处理
前言 Java对象在转json的时候,如果对象里面有属性值为null的话,那么在json序列化的时候要不要序列出来呢?对比以下json转换方式 一.fastJson 1.fastJson在转换java ...
- java json与map互相转换(二)
java json与map互相转换(二) CreationTime--2018年7月16日15点09分 Author:Marydon 1.准备工作 所需jar包: commons-beanutil ...
- java json与map互相转换(一)
java json与map互相转换(一) CreationTime--2018年7月16日 Author:Marydon 1.准备工作 所需jar包:json-20180130.jar impor ...
随机推荐
- ELK 中的elasticsearch 集群的部署
本文内容 背景 ES集群中第一个master节点 ES slave节点 本文总结 Elasticsearch(以下简称ES)搭建集群的经验.以 Elasticsearch-rtf-2.2.1 版本为例 ...
- 设计模式-装饰模式(Decorator Pattern)
装饰模式(Decorator Pattern):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活
- 论Java的ArrayList.add(e)和C++的vector.push_back(e)的区别
Java的ArrayList和C++的vector很类似,都是很基本的线性数据结构.但是他们的表现却不同. 在工作中碰到一个问题就是,搞不清楚到底传进去的是一个新对象,还是当前对象的引用! 经过实战分 ...
- git 生成ssh keys
最近从svn转到gitlab 记录一下如何生成ssh keys 首先下载GitExtensions246SetupComplete.msi并安装,如果已经安装了git,那么安装途中就跳过就行 安装完毕 ...
- [SQL Server 2014] SQL Server 2014新特性探秘
SQL Server 2014新特性探秘(1)-内存数据库 简介 SQL Server 2014提供了众多激动人心的新功能,但其中我想最让人期待的特性之一就要算内存数据库了.去年我再西雅图参加SQ ...
- Spark SQL编程指南(Python)【转】
转自:http://www.cnblogs.com/yurunmiao/p/4685310.html 前言 Spark SQL允许我们在Spark环境中使用SQL或者Hive SQL执行关系型查询 ...
- docker 错误:Error response from daemon: cannot stop container: connect: connection refused": unknown
docker 错误:Error response from daemon: cannot stop container: 795e4102b2de: Cannot kill container 795 ...
- html5 canvas 画图移动端出现锯齿毛边的解决方法
使用HTML5的canvas元素画出来的.在移动端手机上测试都发现画图有一点锯齿问题 出现这个问题的原因应该是手机的宽是720像素的, 而这个canvas是按照小于720像素画出来的, 所以在720像 ...
- linux中chmod与chown两个命令详解
在linux系统中chmod,chown命令都可以来设置权限了,但它们也是有区别的,下文小编为各位介绍chmod与chown两个命令用法与区别介绍. 今天要分享的2个命令也是我们平时常用的,chmod ...
- JAVA-JSP内置对象之application对象
相关资料:<21天学通Java Web开发> application对象1.application对象用来取得和设置Servlet的相关信息.2.application对象的生命周期是从服 ...