java json转换
https://blog.csdn.net/WillJGL/article/details/77866224
?
SpringBoot中如果需要實(shí)現(xiàn)json的序列化和反序列化,我們會(huì)使用json解析工具。一般用到的有fastjson、GSON、Jackson
根據(jù)網(wǎng)上的測(cè)試,Jackson性能好一些,而且Jackson是SpringBoot默認(rèn)引用的
本文記錄SpringBoot如何使用Jackson
準(zhǔn)備
1、在項(xiàng)目中創(chuàng)建包Jackson
2、分別創(chuàng)建4各類(lèi)文件
2.1、Company實(shí)體類(lèi)(里面包含Department的list)
2.2、Department實(shí)體類(lèi)
2.3、jsonController controller類(lèi),接收測(cè)試請(qǐng)求
2.4、JsonHelper Jackson操作類(lèi)
如題所示
每個(gè)類(lèi)內(nèi)容如下
Company
- 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());//對(duì)象方式初始化Log對(duì)象 @GetMapping("") public String index() throws Exception { JsonHelper jm = new JsonHelper(); //1、對(duì)象<->Json //準(zhǔn)備數(shù)據(jù) Company c = getCompany(); //對(duì)象轉(zhuǎn)Json String json = jm.toJson(c); logger.info("1.1、對(duì)象轉(zhuǎn)Json="+json); //Json轉(zhuǎn)對(duì)象 Company obj = jm.fromJson(json,Company.class); logger.info("1.2、Json轉(zhuǎn)對(duì)象="+ obj.getDepartmentArrayList().get(0).getName()); //2、Map<->Json //Json轉(zhuǎn)Map Map map = jm.fromJson(json,Map.class); List<Map> tempList = (List<Map>)map.get("departmentArrayList"); logger.info("2.1、Json轉(zhuǎn)Map="+tempList.get(0).get("name")); //Map轉(zhuǎn)Json json = jm.toJson(map); logger.info("2.2、Map轉(zhuǎn)Json="+json); //3、List<Object> <->Json //準(zhǔn)備數(shù)據(jù) List<Company> companyList = new ArrayList<Company>(); companyList.add(getCompany()); companyList.add(getCompany()); companyList.add(getCompany()); //List<Object>轉(zhuǎn)Json json = jm.toJson(companyList); logger.info("3.1、List<Object>轉(zhuǎn)Json="+json); //Json轉(zhuǎn)List<Object> List<Company> companyListDecode = jm.fromJson(json,new TypeReference<List<Company>>() {}); logger.info("3.2、Json轉(zhuǎn)List<Object>="+companyListDecode.get(0).getDepartmentArrayList().get(0).getName()); //4、Map<String, Object><-> Json //準(zhǔn)備數(shù)據(jù) Map<String, Company> map1 = new HashMap<String, Company>() ; map1.put("1",getCompany()); map1.put("2",getCompany()); map1.put("3",getCompany()); //Map<String, Object>轉(zhuǎn)Json json = jm.toJson(map1); logger.info("4.1、Map<String, Object>轉(zhuǎn)Json="+json); //Json轉(zhuǎn)Map<String, Object> Map<String, Company> map1Decode = jm.fromJson(json,new TypeReference<Map<String, Company>>() {}); logger.info("4.2、Json轉(zhuǎn)Map<String, Object>="+map1Decode.get("1").getDepartmentArrayList().get(0).getName()); //5、List<Map<String, Object>><->Json //準(zhǔn)備數(shù)據(jù) 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>> 轉(zhuǎn)Json json = jm.toJson(listMap); logger.info("5.1、List<Map<String, Object>> 轉(zhuǎn)Json="+json); //Json 轉(zhuǎn) 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>> 轉(zhuǎn)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("部門(mén)1"+sTime); Department d2= new Department(); d2.setEmployeesCount(5); d2.setName("部門(mén)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
轉(zhuǎn)換方式
共舉例如下幾種轉(zhuǎn)換方式(整體在jsonController文件中,這里分別拆出來(lái)說(shuō)明)
對(duì)象<->Json
//1、對(duì)象<->Json//準(zhǔn)備數(shù)據(jù)Company c = getCompany();//對(duì)象轉(zhuǎn)JsonString json = jm.toJson(c); logger.info("1.1、對(duì)象轉(zhuǎn)Json="+json); //Json轉(zhuǎn)對(duì)象 Company obj = jm.fromJson(json,Company.class); logger.info("1.2、Json轉(zhuǎn)對(duì)象="+ obj.getDepartmentArrayList().get(0).getName());- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
Map<->Json
//2、Map<->Json//Json轉(zhuǎn)MapMap map = jm.fromJson(json,Map.class); List<Map> tempList = (List<Map>)map.get("departmentArrayList"); logger.info("2.1、Json轉(zhuǎn)Map="+tempList.get(0).get("name")); //Map轉(zhuǎn)Json json = jm.toJson(map); logger.info("2.2、Map轉(zhuǎn)Json="+json);- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
List<Object> <->Json
//3、List<Object> <->Json//準(zhǔn)備數(shù)據(jù)List<Company> companyList = new ArrayList<Company>();companyList.add(getCompany()); companyList.add(getCompany()); companyList.add(getCompany()); //List<Object>轉(zhuǎn)Json json = jm.toJson(companyList); logger.info("3.1、List<Object>轉(zhuǎn)Json="+json); //Json轉(zhuǎn)List<Object> List<Company> companyListDecode = jm.fromJson(json,new TypeReference<List<Company>>() {}); logger.info("3.2、Json轉(zhuǎn)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//準(zhǔn)備數(shù)據(jù)Map<String, Company> map1 = new HashMap<String, Company>() ; map1.put("1",getCompany()); map1.put("2",getCompany()); map1.put("3",getCompany()); //Map<String, Object>轉(zhuǎn)Json json = jm.toJson(map1); logger.info("4.1、Map<String, Object>轉(zhuǎn)Json="+json); //Json轉(zhuǎn)Map<String, Object> Map<String, Company> map1Decode = jm.fromJson(json,new TypeReference<Map<String, Company>>() {}); logger.info("4.2、Json轉(zhuǎn)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 //準(zhǔn)備數(shù)據(jù) 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>> 轉(zhuǎn)Json json = jm.toJson(listMap); logger.info("5.1、List<Map<String, Object>> 轉(zhuǎn)Json="+json); //Json 轉(zhuǎn) 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>> 轉(zhuǎn)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
測(cè)試
訪問(wèn)controller的方法,查看日志可以看出來(lái)每種轉(zhuǎn)換都可以成功轉(zhuǎn)為json,也可以成功轉(zhuǎn)為對(duì)象
其它特性
在有些時(shí)候,我們會(huì)希望進(jìn)行一些特殊處理,例如json不
忽略字段
@JsonIgnore 進(jìn)行JSON操作時(shí)忽略該屬性。
對(duì)于實(shí)體類(lèi)中,如果有某個(gè)字段不希望參與json序列化與反序列化,可以把屬性標(biāo)記為@JsonIgnore
例如Company這個(gè)類(lèi)
如果我們給Name、Address、employeesCount三個(gè)屬性賦值了,序列化出來(lái)的內(nèi)容是
- 1
- 2
- 3
- 4
- 5
如果employeesCount是一個(gè)內(nèi)容計(jì)數(shù)的值,不希望參與序列化,我們可以標(biāo)記它
@JsonIgnoreprivate int employeesCount;- 1
- 2
這樣再次序列化的結(jié)果就變?yōu)榱?/span>
{"name": "公司名1504689048950", "address": "地址" }- 1
- 2
- 3
- 4
處理時(shí)間類(lèi)型
@JsonFormat(pattern = “yyyy年MM月dd日”) 時(shí)間格式化
我們?cè)贑ompany實(shí)體類(lèi)增加一個(gè)Date類(lèi)型的屬性,并且賦值序列化
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
賦值然后再序列化,得到的內(nèi)容是
{"name": "公司名1504689283756", "address": "地址", "createDate": 1504689283756 }- 1
- 2
- 3
- 4
- 5
可以看到時(shí)間是一個(gè)數(shù)字
我們標(biāo)記這個(gè)屬性,再次序列化
- 1
- 2
- 3
- 4
- 5
時(shí)間按照指定的格式顯示了
更改字段序列化名
@JsonProperty(“newName”) 改字段名
默認(rèn)情況下,字段名是什么,序列化出來(lái)的key值也就是什么,如果我們希望序列化出來(lái)的名字和字段名不一樣,則需要使用這個(gè)標(biāo)記
我們把Company的name標(biāo)記為newName
- 1
- 2
然后進(jìn)行序列化
{"address": "地址", "createDate": "2017年09月06日", "newName": "公司名1504689496978" }- 1
- 2
- 3
- 4
- 5
可以看出來(lái),結(jié)果出來(lái)的key就使用了自定義的名字
總結(jié)
以上是生活随笔為你收集整理的java json转换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Data_Structure03-栈和队
- 下一篇: 正交相机下实现滚轮按钮拖动,滚动滚轮缩放