1. 程式人生 > >解決fastjson不輸出空字串/設定fastjson空值也顯示

解決fastjson不輸出空字串/設定fastjson空值也顯示

問題背景

//設定
Map < String , Object > jsonMap = new HashMap< String , Object>();  
jsonMap.put("a",111);  
jsonMap.put("b","aaa");  
jsonMap.put("c",null);  
jsonMap.put("d","blog.csdn.net/moshowgame");  

//輸出
String str = JSONObject.toJSONString(jsonMap);  
System.out.println(str);  
	
//輸出結果:{"a":111,"b":"aa",d:"blog.csdn.net/moshowgame"}  

從輸出結果可以看出,只要value為空,key的值就會被過濾掉,這明顯不是我們想要的結果,會導致一些坑爹的行為。

解決方案

這時我們就需要用到fastjson的SerializerFeature序列化屬性,也就是這個方法:

JSONObject.toJSONString(Object object, SerializerFeature... features)

SerializerFeature有用的一些列舉值

QuoteFieldNames———-輸出key時是否使用雙引號,預設為true
WriteMapNullValue——–是否輸出值為null的欄位,預設為false
WriteNullNumberAsZero—-數值欄位如果為null,輸出為0,而非null
WriteNullListAsEmpty—–List欄位如果為null,輸出為[],而非null
WriteNullStringAsEmpty—字元型別欄位如果為null,輸出為”“,而非null
WriteNullBooleanAsFalse–Boolean欄位如果為null,輸出為false,而非null

如果是幾句程式碼,直接就
String jsonStr =
JSONObject.toJSONString(object,SerializerFeature.WriteMapNullValue);

如果是專案,需要配置FastjsonConverter.java

package com.softdev.system.likeu.config;

import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

import com.alibaba.fastjson.serializer.SerializerFeature;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.StringHttpMessageConverter;

import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
/**
 * 新增fastjson的轉換
 */
@Configuration
public class FastjsonConverter {

	@Bean
	public HttpMessageConverters customConverters() {
		// 定義一個轉換訊息的物件
		
		FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();

		// 新增fastjson的配置資訊 比如 :是否要格式化返回的json資料
		FastJsonConfig fastJsonConfig = new FastJsonConfig();
		// 這裡就是核心程式碼了,WriteMapNullValue把空的值的key也返回
		fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteMapNullValue);

		List<MediaType> fastMediaTypes = new ArrayList<MediaType>();

		// 處理中文亂碼問題
		fastJsonConfig.setCharset(Charset.forName("UTF-8"));
		fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
		fastConverter.setSupportedMediaTypes(fastMediaTypes);
		// 在轉換器中新增配置資訊
		fastConverter.setFastJsonConfig(fastJsonConfig);
		
		StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
		stringConverter.setDefaultCharset(Charset.forName("UTF-8"));
		stringConverter.setSupportedMediaTypes(fastMediaTypes);
		
		// 將轉換器新增到converters中
		return new HttpMessageConverters(stringConverter,fastConverter);
	}
}