java實體類轉(zhuǎn)json時null值不要轉(zhuǎn)為"null"問題
java實體類轉(zhuǎn)json時null值不要轉(zhuǎn)為“null”
可以使用 Gson 庫中的 GsonBuilder 來解決這個問題。
你可以使用 GsonBuilder 的 setSerializationNulls() 方法來設(shè)置 null 值是否應(yīng)該被序列化。
這是一個示例代碼:
Gson gson =new GsonBuilder().setSerializationNulls(false).create(); String json = gson.toJson(yourObject);
這樣就可以在轉(zhuǎn)換實體類為 JSON 時避免 null 值被轉(zhuǎn)化為 "null"。
實體類轉(zhuǎn)JSON字段為null時不顯示key?
一、什么是fastjson?
fastjson是阿里巴巴的開源JSON解析庫,它可以解析JSON格式的字符串,支持將Java Bean序列化為JSON字符串,也可以從JSON字符串反序列化到JavaBean。
二、如何使用
添加如下maven依賴即可:
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.60</version> </dependency>
三、fastjson默認(rèn)序列化
fastjson入口類是com.alibaba.fastjson.JSON,一個最簡單默認(rèn)的序列化代碼如下:
User user = new User(); String str= JSON.toJSONString(user);
四、如何自定義序列化
fastjson支持多種方式自定義序列化。
1.使用序列化屬性SerializerFeature
SerializerFeature常用屬性如下:
名稱 | 含義 |
---|---|
WriteNonStringKeyAsString | 如果key不為String,則轉(zhuǎn)換為String |
WriteNonStringValueAsString | 如果value不為String,則轉(zhuǎn)換為String |
WriteMapNullValue | 輸出為空的字段 |
WriteNullStringAsEmpty | String為null時輸出"" |
WriteNullNumberAsZero | number為null時輸出0 |
WriteDateUseDateFormat | 修改日期格式,yyyy-MM-dd |
常用的屬性介紹完了,咱們先來看下效果,新建一個User類,代碼如下:
@Data public class User implements Serializable { private static final long serialVersionUID = 1L; private Integer id; private Integer age; private String name; private String sex; private Date createDate; private Map<Integer, Integer> dataMap; }
運行類代碼如下:
public static void main(String[] args) { User user = new User(); user.setId(1000); user.setName("Java碎碎念"); user.setCreateDate(new Date()); Map<Integer, Integer> datamap = new HashMap<>(); datamap.put(1, 100); datamap.put(2, 200); user.setDataMap(datamap); System.out.println("默認(rèn)序列化結(jié)果:\n" + JSON.toJSONString(user)); System.out.println("指定WriteNonStringKeyAsString序列化結(jié)果:\n" + JSON.toJSONString(user, SerializerFeature.WriteNonStringKeyAsString)); System.out.println("指定WriteNonStringValueAsString序列化結(jié)果:\n" + JSON.toJSONString(user, SerializerFeature.WriteNonStringValueAsString)); System.out.println("指定WriteMapNullValue序列化結(jié)果:\n" + JSON.toJSONString(user, SerializerFeature.WriteMapNullValue)); System.out.println("指定WriteNullStringAsEmpty序列化結(jié)果:\n" + JSON.toJSONString(user, SerializerFeature.WriteNullStringAsEmpty)); System.out.println("指定WriteNullNumberAsZero序列化結(jié)果:\n" + JSON.toJSONString(user, SerializerFeature.WriteNullNumberAsZero)); System.out.println("指定WriteDateUseDateFormat序列化結(jié)果:\n" + JSON.toJSONString(user, SerializerFeature.WriteDateUseDateFormat)); }
運行結(jié)果:
默認(rèn)序列化結(jié)果:
{"createDate":1575038247084,"dataMap":{1:100,2:200},"id":1000,"name":"Java碎碎念"}
指定WriteNonStringKeyAsString序列化結(jié)果:
{"createDate":1575038247084,"dataMap":{"1":100,"2":200},"id":1000,"name":"Java碎碎念"}
指定WriteNonStringValueAsString序列化結(jié)果:
{"createDate":1575038247084,"dataMap":{1:"100",2:"200"},"id":"1000","name":"Java碎碎念"}
指定WriteMapNullValue序列化結(jié)果:
{"age":null,"createDate":1575038247084,"dataMap":{1:100,2:200},"id":1000,"name":"Java碎碎念","sex":null}
指定WriteNullStringAsEmpty序列化結(jié)果:
{"createDate":1575038247084,"dataMap":{1:100,2:200},"id":1000,"name":"Java碎碎念","sex":""}
指定WriteNullNumberAsZero序列化結(jié)果:
{"age":0,"createDate":1575038247084,"dataMap":{1:100,2:200},"id":1000,"name":"Java碎碎念"}
指定WriteDateUseDateFormat序列化結(jié)果:
{"createDate":"2019-11-29 22:37:27","dataMap":{1:100,2:200},"id":1000,"name":"Java碎碎念"}
2.使用JSONField
JSONField是fastjson的一個注解,可以用在字段上,也可以用在getter/setter方法上面。
- 2.1 JSONField注解
注解主要內(nèi)容如下:
package com.alibaba.fastjson.annotation; public @interface JSONField { // 配置序列化和反序列化的順序,1.1.42版本之后才支持 int ordinal() default 0; // 指定字段的名稱 String name() default ""; // 指定字段的格式,對日期格式有用 String format() default ""; // 是否序列化 boolean serialize() default true; // 是否反序列化 boolean deserialize() default true; }
- 2.2 JSONField注解配置方式
結(jié)果和預(yù)期一致,說明自定義序列化沒有問題,到此fastjson自定義序列化的功能已經(jīng)全部實現(xiàn),有問題歡迎留言溝通哦!
配置在字段上
@Data public class User implements Serializable { @JSONField(name = "_id") private Integer id; }
配置在getter/setter上
@JSONField(name="_id") public Integer getId() { return id; } @JSONField(name="_id") public void setId(Integer id) { this.id = id; }
使用format配置日期格式化
@JSONField(format="yyyy-MM-dd") private Date createDate;
使用serialize/deserialize指定字段不序列化
@JSONField(serialize=false) private Integer age;
下面直接修改代碼看下效果,修改后User類如下:
@Data public class User implements Serializable { private static final long serialVersionUID = 1L; @JSONField(name = "_id", ordinal = 3) private Integer id; @JSONField(serialize = false, ordinal = 4) private Integer age; @JSONField(ordinal = 1) private String name; @JSONField(ordinal = 2) private String sex; @JSONField(format = "yyyy-MM-dd", ordinal = 5) private Date createDate; }
測試類運行結(jié)果如下:
默認(rèn)序列化結(jié)果:
{"age":18,"createDate":1575006127174,"id":1000,"name":"Java碎碎念"}
使用JSONField后序列化結(jié)果:
{"name":"Java碎碎念","_id":1000,"createDate":"2019-11-29"}
通過運行結(jié)果可以看到,使用@JSONField注解變化如下:
- id序列化后變成了_id
- createDate格式化為yyyy-MM-dd
- 序列化后字段的順序跟ordinal指定的一致
- 設(shè)置了serialize=false的字段age沒有序列化
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot集成ENC對配置文件進(jìn)行加密的流程步驟
Spring Boot Encoder,即Spring Boot加密模塊,它提供了一種簡單的方式來集成安全編碼功能到Spring Boot應(yīng)用程序中,它是Spring Security框架的一部分,旨在幫助開發(fā)者輕松地處理數(shù)據(jù)加密,本文給大家介紹了SpringBoot集成ENC對配置文件進(jìn)行加密的流程步驟2024-12-12MyBatis批量插入/修改/刪除MySql數(shù)據(jù)
這篇文章主要給大家介紹了關(guān)于MyBatis批量插入/修改/刪除MySql數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05SpringBoot集成Beetl后統(tǒng)一處理頁面異常的方法
這篇文章主要介紹了SpringBoot集成Beetl后統(tǒng)一處理頁面異常的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08