Java使用ObjectMapper的簡(jiǎn)單示例
一、什么是ObjectMapper?
- ObjectMapper類是Jackson庫的主要類,它提供一些功能將數(shù)據(jù)集或?qū)ο筠D(zhuǎn)換的實(shí)現(xiàn)。
- 它將使用JsonParser和JsonGenerator實(shí)例來實(shí)現(xiàn)JSON的實(shí)際讀/寫。
二、ObjectMapper怎么使用?
2.1 配置
2.1.1 普通Java項(xiàng)目(引入如下依賴即可)
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.5</version> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.5</version> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.5</version> </dependency>
2.1.2 Sring Boot項(xiàng)目
重要說明:
由于Spring Boot的自動(dòng)配置JacksonAutoConfiguration中有如下圖所示的依賴引入和配置,所以不需要我們額外配置
2.2 實(shí)戰(zhàn)
User類
@Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) public class User implements Serializable { private static final long serialVersionUID = 1L; // 姓名 private String name; // 性別 private String sex; // 年齡 private Integer age; }
2.2.1 Java對(duì)象、集合轉(zhuǎn)JSON
public static void main(String[] args) throws IOException { ObjectMapper objectMapper = new ObjectMapper(); User user = new User(); user.setName("張三"); user.setAge(20); user.setSex("男"); List<User> userList = new ArrayList<>(); userList.add(user); // 對(duì)象轉(zhuǎn)換為JSON String userJsonString = objectMapper.writeValueAsString(user); // 集合轉(zhuǎn)換為JSON String userListJsonString = objectMapper.writeValueAsString(userList); }
2.2.2 JSON轉(zhuǎn)Java對(duì)象、集合
// JOSN轉(zhuǎn)對(duì)象(java對(duì)象) User newUser = objectMapper.readValue(userJsonString, User.class); // JOSN轉(zhuǎn)集合(集合) List<User> list = objectMapper.readValue(userListJsonString, new TypeReference<List<User>>(){});
2.2.3json轉(zhuǎn)JsonNode、ObjectNode
說明:
Jackson的JsonNode和ObjectNode兩個(gè)類,前者是不可變的,一般用于讀取。后者可變,一般用于創(chuàng)建Json對(duì)象圖。
// json轉(zhuǎn)JsonNode JsonNode jsonNode = objectMapper.readTree(userJsonString); String sex = jsonNode.get("sex").asText(); // JsonNode轉(zhuǎn)ObjectNode ObjectNode objectNode = (ObjectNode)jsonNode; // json轉(zhuǎn)JsonNode JsonNode jsonNodeList = objectMapper.readTree(userListJsonString); // JsonNode轉(zhuǎn)ObjectNode ArrayNode arrayNode = (ArrayNode)jsonNodeList;
2.2.4 jsonNode轉(zhuǎn)對(duì)象、集合
// jsonNode轉(zhuǎn)為json字符串 String jsonNodeString = objectMapper.writeValueAsString(jsonNode); String jsonNodeListString = objectMapper.writeValueAsString(jsonNodeList); // json字符串轉(zhuǎn)對(duì)象、集合 User user1 = objectMapper.readValue(jsonNodeString, User.class); List<User> list1 = objectMapper.readValue(jsonNodeListString, new TypeReference<List<User>>() {});
2.3 注意事項(xiàng)
2.3.1微服務(wù)中從其他服務(wù)獲取過來的對(duì)象,如果從Object強(qiáng)轉(zhuǎn)為自定義的類型會(huì)報(bào)錯(cuò),利用ObjectMapper轉(zhuǎn)換。
正確示例:
說明:Schedule類、OutpOrderBill類都是類似于User類的Java對(duì)象。
// 對(duì)象 Schedule schedule = objectMapper.convertValue(callNurseCenterService.getSchedule(registRecord.getScheCode()).getData(), Schedule.class); // 泛型為對(duì)象的集合 List<OutpOrderBill> outpOrderBillList = objectMapper.convertValue( callChargeCenterService.getOrderBillByOrderCode(orders.getOrgCode(),orders.getOrderCode()).getData(), new TypeReference<List<OutpOrderBill>>() {});
2.3.2 上面轉(zhuǎn)換的過程中,如果返回的字段你不是都需要,需要忽略其中的幾個(gè)字段,在自定義的類中添加標(biāo)紅注解
@Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @JsonIgnoreProperties(ignoreUnknown = true) public class User implements Serializable { private static final long serialVersionUID = 1L; ////提供有這個(gè)參數(shù),但是不想獲取 // // 姓名 // private String name; // 性別 private String sex; // 年齡 private Integer age; }
如果不想添加注解,可以使用下面兩種方式
第一種方式:
ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD,Visibility.ANY); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
第二種方式:
ObjectMapper objectMapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
2.3.3 在轉(zhuǎn)換的過程中,有可能有的屬性被設(shè)成空就不序列化等的需求,可以在類的屬性上或直接在類上加上一下注解。用在屬性上就是只針對(duì)一個(gè)屬性,用在類上就是針對(duì)類里的所有屬性。
@JsonInclude(Include.NON_NULL) @JsonInclude(Include.Include.ALWAYS) 默認(rèn) @JsonInclude(Include.NON_DEFAULT) 屬性為默認(rèn)值不序列化 @JsonInclude(Include.NON_EMPTY) 屬性為 空(“”) 或者為 NULL 都不序列化 @JsonInclude(Include.NON_NULL) 屬性為NULL 不序列化
參考網(wǎng)址:
到此這篇關(guān)于Java使用ObjectMapper的簡(jiǎn)單示例的文章就介紹到這了,更多相關(guān)Java使用ObjectMapper內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java如何實(shí)現(xiàn)壓縮文件與解壓縮zip文件
這篇文章主要介紹了Java如何實(shí)現(xiàn)壓縮文件與解壓縮zip文件問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12SpringBoot熱部署啟動(dòng)關(guān)閉流程詳解
Spring?Boot啟動(dòng)熱部署是一種技術(shù),它能讓開發(fā)者在不重啟應(yīng)用程序的情況下實(shí)時(shí)更新代碼。這樣可以提高開發(fā)效率,避免頻繁重啟應(yīng)用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-04-04詳解Java中使用externds關(guān)鍵字繼承類的用法
子類使用extends繼承父類是Java面向?qū)ο缶幊讨械幕A(chǔ)知識(shí),這里我們就來詳解Java中使用externds關(guān)鍵字繼承類的用法,需要的朋友可以參考下2016-07-07MyBatis結(jié)果映射(ResultMap)的使用
在MyBatis中,結(jié)果映射是實(shí)現(xiàn)數(shù)據(jù)庫結(jié)果集到Java對(duì)象映射的核心,它不僅支持簡(jiǎn)單的字段映射,還能處理字段名不一致、嵌套對(duì)象和集合映射等復(fù)雜場(chǎng)景,通過ResultMap,開發(fā)者可以靈活定義映射關(guān)系,以適應(yīng)各種需求,感興趣的可以了解一下2024-09-09MyBatis注解開發(fā)-@Insert和@InsertProvider的使用
這篇文章主要介紹了MyBatis注解開發(fā)-@Insert和@InsertProvider的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2022-07-07Spring中BeanFactoryPostProcessors是如何執(zhí)行的
BeanFactoryPostProcessor是Spring容器提供的一個(gè)擴(kuò)展機(jī)制,它允許開發(fā)者在Bean的實(shí)例化和初始化之前對(duì)BeanDefinition進(jìn)行修改和處理,這篇文章主要介紹了你知道Spring中BeanFactoryPostProcessors是如何執(zhí)行的嗎,需要的朋友可以參考下2023-11-11Java使用Lettuce客戶端在Redis在主從復(fù)制模式下命令執(zhí)行的操作
這篇文章主要介紹了Java使用Lettuce客戶端在Redis在主從復(fù)制模式下命令執(zhí)行的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04