Jackson使用示例-Bean、XML、Json之間相互轉(zhuǎn)換
前言
目前常見(jiàn)的json解析工具有jackson、fastjson、gson。
- jackson是Spring mvc內(nèi)置的json轉(zhuǎn)換工具;
- fastjson是阿里的開(kāi)源JSON解析庫(kù),由于fastjson經(jīng)常會(huì)出現(xiàn)漏洞,暫不考慮;
- Jackson是一個(gè)強(qiáng)大工具,可用于Json、XML、實(shí)體之間的相互轉(zhuǎn)換。
Jackson相關(guān)注解
注解 | 說(shuō)明 |
@JsonProperties | 把屬性的名稱(chēng)序列化時(shí)轉(zhuǎn)換為另外一個(gè)名稱(chēng) ;@JsonProperty(“DepName”) |
@JsonFormat | 把屬性的格式序列化時(shí)轉(zhuǎn)換成指定的格式;@JsonFormat(pattern = “yyyy-MM-dd”) |
@JsonPropertyOrder | 指定屬性在序列化時(shí) json 中的順序;@JsonPropertyOrder({ “age”, “name” }) |
@JsonIgnore | 排除指定屬性不被json序列化 |
@JacksonXmlProperty | 指定XML命名空間的名稱(chēng);@JacksonXmlProperty(localName = “DepName”) |
@JacksonXmlRootElement | 指定XML根元素命名空間的名稱(chēng);@JacksonXmlRootElement(localName = “RootName”) |
@JacksonXmlElementWrapper | 可用于指定List等集合類(lèi),外圍標(biāo)簽名;@JacksonXmlElementWrapper(localName = “EmpMessage”) |
1、對(duì)象和json互轉(zhuǎn)
引入jackson相關(guān)依賴(lài):
<!--注解包,提供標(biāo)準(zhǔn)注解功能--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> </dependency> <!--核心包,提供基于"流模式"解析的相關(guān) API--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> </dependency> <!--數(shù)據(jù)綁定包,提供基于"對(duì)象綁定" 解析的相關(guān) API ( ObjectMapper ) 和"樹(shù)模型" 解析的相關(guān) API--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <!--日期類(lèi)型序列化包--> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> </dependency> <!--引入xml功能--> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> </dependency>
Employees實(shí)體類(lèi):
@Data @AllArgsConstructor @NoArgsConstructor public class Employees { private String name; private Integer age; private String sex; }
測(cè)試代碼:
/** * @author 秋一葉 * @create 2024-04-23 21:00 * json字符串和對(duì)象、集合、map互轉(zhuǎn) * */ public class Demo2 { public static void main(String[] args) { ObjectMapper objectMapper = new ObjectMapper(); Employees employees1 = new Employees("秋一葉",18,"男"); Employees employees2 = new Employees("小王",20,"男"); try { //對(duì)象轉(zhuǎn)json字符串 String jsonString = objectMapper.writeValueAsString(employees1); //json字符串轉(zhuǎn)為對(duì)象 Employees emp1 = objectMapper.readValue(jsonString, Employees.class); System.out.println("json字符串:" + jsonString); System.out.println("對(duì)象1:" + emp1); System.out.println("===================================================="); //對(duì)象轉(zhuǎn)為json字符串寫(xiě)入文件 objectMapper.writeValue(new File("emp.json"), employees1); //從文件中讀取json字符串轉(zhuǎn)為對(duì)象 Employees emp2 = objectMapper.readValue(new File("emp.json"), Employees.class); System.out.println("對(duì)象2:" + emp2); System.out.println("===================================================="); //對(duì)象寫(xiě)為字節(jié)流 byte[] bytes = objectMapper.writeValueAsBytes(employees1); //字節(jié)流轉(zhuǎn)為對(duì)象 Employees emp3 = objectMapper.readValue(bytes, Employees.class); System.out.println("對(duì)象3:" + emp3); System.out.println(); System.out.println("*****************************************************"); System.out.println(); //Map和json互轉(zhuǎn) Map<String, Object> map = Maps.newHashMap(); map.put("001", employees1); map.put("002", "元旦"); String mapToString = objectMapper.writeValueAsString(map); Map<String, Object> stringToMap = objectMapper.readValue(mapToString, new TypeReference<Map<String, Object>>() { }); System.out.println("json字符串:" + mapToString); System.out.println("map:" + stringToMap); System.out.println("===================================================="); //List和json互轉(zhuǎn) List<Employees> empList = Lists.newArrayList(employees1, employees2); String jsonList = objectMapper.writeValueAsString(empList); List<Employees> stringToList = objectMapper.readValue(jsonList, new TypeReference<List<Employees>>() { }); System.out.println("json字符串:" + jsonList); System.out.println("map:" + stringToList); } catch (IOException e) { e.printStackTrace(); } } }
打印結(jié)果:
json字符串:{"name":"秋一葉","age":18,"sex":"男"} 對(duì)象1:Employees(name=秋一葉, age=18, sex=男) ==================================================== 對(duì)象2:Employees(name=秋一葉, age=18, sex=男) ==================================================== 對(duì)象3:Employees(name=秋一葉, age=18, sex=男) ***************************************************** json字符串:{"001":{"name":"秋一葉","age":18,"sex":"男"},"002":"元旦"} map:{001={name=秋一葉, age=18, sex=男}, 002=元旦} ==================================================== json字符串:[{"name":"秋一葉","age":18,"sex":"男"},{"name":"小王","age":20,"sex":"男"}] map:[Employees(name=秋一葉, age=18, sex=男), Employees(name=小王, age=20, sex=男)]
2、XML和對(duì)象互轉(zhuǎn)
Department實(shí)體:
@Data @JacksonXmlRootElement(localName = "RootName") public class Department { @JacksonXmlProperty(localName = "DepName") private String depName; @JacksonXmlElementWrapper(localName = "EmpMessage") @JacksonXmlProperty(localName = "EmpName") List<Employees> employees; }
測(cè)試代碼:
public class Demo1 { public static void main(String[] args) { XmlMapper xmlMapper = new XmlMapper(); //字段為null,自動(dòng)忽略,不再序列化 xmlMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); Department department = new Department(); Employees employees1 = new Employees("秋一葉",18,"男"); Employees employees2 = new Employees("小王",20,"男"); department.setDepName("產(chǎn)品研發(fā)部門(mén)"); department.setEmployees(Lists.newArrayList(employees1, employees2)); try { //對(duì)象轉(zhuǎn)xml String xml = xmlMapper.writeValueAsString(department); //xml轉(zhuǎn)對(duì)象 Department dep = xmlMapper.readValue(xml, Department.class); System.out.println("返回的xml:" + xml); System.out.println("返回的實(shí)體:" + dep); } catch (JsonProcessingException e) { e.printStackTrace(); } } }
打印結(jié)果:
返回的xml:<RootName><DepName>產(chǎn)品研發(fā)部門(mén)</DepName><EmpMessage><EmpName><name>秋一葉</name><age>18</age><sex>男</sex></EmpName><EmpName><name>小王</name><age>20</age><sex>男</sex></EmpName></EmpMessage></RootName> 返回的實(shí)體:Department(depName=產(chǎn)品研發(fā)部門(mén), employees=[Employees(name=秋一葉, age=18, sex=男), Employees(name=小王, age=20, sex=男)])
到此這篇關(guān)于Jackson使用示例-Bean、XML、Json之間相互轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)Jackson使Bean、XML、Json互換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 一篇文章了解Jackson注解@JsonFormat及失效解決辦法
- Java中對(duì)象?和?json?互轉(zhuǎn)四種方式?json-lib、Gson、FastJson、Jackson
- 利用Jackson解決Json序列化和反序列化問(wèn)題
- Java利用Jackson輕松處理JSON序列化與反序列化
- Jackson中json格式的字符串與對(duì)象的互相轉(zhuǎn)換方式
- 如何自定義Jackson序列化?@JsonSerialize
- JSON中fastjson、jackson、gson如何選擇
- jackson 如何將實(shí)體轉(zhuǎn)json json字符串轉(zhuǎn)實(shí)體
- 使用jackson實(shí)現(xiàn)對(duì)象json之間的相互轉(zhuǎn)換(spring boot)
- 使用Jackson-json解析一個(gè)嵌套的json字符串
- Jackson庫(kù)進(jìn)行JSON?序列化時(shí)遇到了無(wú)限遞歸(Infinite?Recursion)的問(wèn)題及解決方案
相關(guān)文章
JavaWeb入門(mén):ServletContext詳解和應(yīng)用
這篇文章主要介紹了Java ServletContext對(duì)象用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-07-07JAVA8發(fā)送帶有Body的HTTP GET請(qǐng)求
本文主要介紹了JAVA8發(fā)送帶有Body的HTTP GET請(qǐng)求,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06Spring中AOP概念與兩種動(dòng)態(tài)代理模式原理詳解
AOP是面向切面編程的技術(shù),AOP基于IoC基礎(chǔ),是對(duì)OOP的有益補(bǔ)充,流行的AOP框架有Sping AOP、AspectJ,這篇文章主要給大家介紹了關(guān)于Spring中AOP概念與兩種動(dòng)態(tài)代理模式原理的相關(guān)資料,需要的朋友可以參考下2021-10-10Java中args參數(shù)數(shù)組的用法說(shuō)明
這篇文章主要介紹了Java中args參數(shù)數(shù)組的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02集成Spring Redis緩存的實(shí)現(xiàn)
今天小編就為大家分享一篇關(guān)于集成Spring Redis緩存的實(shí)現(xiàn),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12Mybatis結(jié)果集自動(dòng)映射的實(shí)例代碼
在使用Mybatis時(shí),有的時(shí)候我們可以不用定義resultMap,而是直接在<select>語(yǔ)句上指定resultType。這個(gè)時(shí)候其實(shí)就用到了Mybatis的結(jié)果集自動(dòng)映射,下面通過(guò)本文給大家分享Mybatis結(jié)果集自動(dòng)映射的實(shí)例代碼,一起看看吧2017-02-02