java實(shí)體類轉(zhuǎn)json時(shí)null值不要轉(zhuǎn)為"null"問題
java實(shí)體類轉(zhuǎn)json時(shí)null值不要轉(zhuǎn)為“null”
可以使用 Gson 庫中的 GsonBuilder 來解決這個(gè)問題。
你可以使用 GsonBuilder 的 setSerializationNulls() 方法來設(shè)置 null 值是否應(yīng)該被序列化。
這是一個(gè)示例代碼:
Gson gson =new GsonBuilder().setSerializationNulls(false).create(); String json = gson.toJson(yourObject);
這樣就可以在轉(zhuǎn)換實(shí)體類為 JSON 時(shí)避免 null 值被轉(zhuǎn)化為 "null"。
實(shí)體類轉(zhuǎn)JSON字段為null時(shí)不顯示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,一個(gè)最簡(jiǎn)單默認(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時(shí)輸出"" |
| WriteNullNumberAsZero | number為null時(shí)輸出0 |
| WriteDateUseDateFormat | 修改日期格式,yyyy-MM-dd |
常用的屬性介紹完了,咱們先來看下效果,新建一個(gè)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;
}運(yùn)行類代碼如下:
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));
}運(yùn)行結(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的一個(gè)注解,可以用在字段上,也可以用在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 "";
// 指定字段的格式,對(duì)日期格式有用
String format() default "";
// 是否序列化
boolean serialize() default true;
// 是否反序列化
boolean deserialize() default true;
}- 2.2 JSONField注解配置方式
結(jié)果和預(yù)期一致,說明自定義序列化沒有問題,到此fastjson自定義序列化的功能已經(jīng)全部實(shí)現(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;
}測(cè)試類運(yùn)行結(jié)果如下:
默認(rèn)序列化結(jié)果:
{"age":18,"createDate":1575006127174,"id":1000,"name":"Java碎碎念"}
使用JSONField后序列化結(jié)果:
{"name":"Java碎碎念","_id":1000,"createDate":"2019-11-29"}
通過運(yùn)行結(jié)果可以看到,使用@JSONField注解變化如下:
- id序列化后變成了_id
- createDate格式化為yyyy-MM-dd
- 序列化后字段的順序跟ordinal指定的一致
- 設(shè)置了serialize=false的字段age沒有序列化
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于SpringMVC中數(shù)據(jù)綁定@ModelAttribute注解的使用
這篇文章主要介紹了關(guān)于SpringMVC中數(shù)據(jù)綁定@ModelAttribute注解的使用,SpringMVC是一個(gè)基于Spring框架的Web框架,它提供了一種簡(jiǎn)單、靈活的方式來開發(fā)Web應(yīng)用程序,在開發(fā)Web應(yīng)用程序時(shí),我們需要將用戶提交的數(shù)據(jù)綁定到我們的Java對(duì)象上,需要的朋友可以參考下2023-07-07
spring mvc實(shí)現(xiàn)文件上傳與下載功能
這篇文章主要為大家詳細(xì)介紹了spring mvc實(shí)現(xiàn)文件上傳與下載功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
Java 獲取當(dāng)前設(shè)備的 IP 地址(最新推薦)
Internet 協(xié)議 (IP) 地址可以是連接到 TCP/IP 網(wǎng)絡(luò)的每個(gè)設(shè)備的標(biāo)識(shí)符,該標(biāo)識(shí)符用于識(shí)別和定位中間通信的節(jié)點(diǎn),這篇文章主要介紹了在 Java 中獲取當(dāng)前設(shè)備的 IP 地址,需要的朋友可以參考下2023-06-06
Java+opencv3.2.0實(shí)現(xiàn)人臉檢測(cè)功能
這篇文章主要為大家詳細(xì)介紹了Java+opencv3.2.0實(shí)現(xiàn)人臉檢測(cè)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
java9新特性Reactive?Stream響應(yīng)式編程?API
這篇文章主要為大家介紹了java9新特性響應(yīng)式編程API的特點(diǎn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
springboot項(xiàng)目打docker鏡像實(shí)例(入門級(jí))
最近做個(gè)項(xiàng)目,我們想把自己的程序打包成鏡像,并運(yùn)行在docker容器中,本文主要介紹了springboot項(xiàng)目打docker鏡像實(shí)例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06

