1、问题

使用Fastjson的JSONObject对象putnull值并转字符串后发现结果中并没有值为null的那一项:

JSONObject data = new JSONObject();
data.put("foo", "Hello World!");
data.put("bar", null);

String str = data.toJSONString();
System.out.println(str);

输出:

{"foo":"Hello World!"}

2、处理方法

可以使用设置了SerializerFeature.WriteMapNullValueJSONObject.toJSONString方法来获得想要的结果:

JSONObject data = new JSONObject();
data.put("foo", "Hello World!");
data.put("bar", null);

String str = JSONObject.toJSONString(data, SerializerFeature.WriteMapNullValue);
System.out.println(str);

输出:

{"bar":null,"foo":"Hello World!"}

3、扩展

其他特性配置:

  • QuoteFieldNames

使用单引号:

{'foo':'Hello World!'}
  • WriteNullStringAsEmpty

String类型值为空则输出”“。

  • WriteNullBooleanAsFalse

Boolean类型值为空则输出false。

  • WriteNullNumberAsZero

Number类型值为空则输出0。

  • WriteNullListAsEmpty

List类型值为空则输出[]。

  • WriteDateUseDateFormat

全局修改日期格式。

JSONObject data = new JSONObject();
data.put("date", new Date());

String str = JSONObject.toJSONString(data);
System.out.println(str);

输出:

{"date":1612194055861}
JSONObject data = new JSONObject();
data.put("date", new Date());

//修改默认格式
JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";

String str = JSONObject.toJSONString(data, SerializerFeature.WriteDateUseDateFormat);
System.out.println(str);

输出:

{"date":"2021-02-01"}
  • PrettyFormat

格式化JSON缩进。

样例:

Example.java:

class Example{
	private String s;
	private Boolean b;
	private Integer i;
	private List<String> list;
	public String getS() {
		return s;
	}
	public void setS(String s) {
		this.s = s;
	}
	public Boolean getB() {
		return b;
	}
	public void setB(Boolean b) {
		this.b = b;
	}
	public Integer getI() {
		return i;
	}
	public void setI(Integer i) {
		this.i = i;
	}
	public List<String> getList() {
		return list;
	}
	public void setList(List<String> list) {
		this.list = list;
	}
}
JSONObject data = new JSONObject();
		
String value = null;
data.put("foo", value);
List<String> list = null;
data.put("bar", list);
Integer num = null;
data.put("num", num);

//与前面两个属性对比:WriteNullStringAsEmpty等属性对对象属性生效
data.put("example", new Example());

SerializerFeature[] features = new SerializerFeature[]{
		SerializerFeature.WriteMapNullValue, 
		SerializerFeature.WriteNullStringAsEmpty,
		SerializerFeature.WriteNullBooleanAsFalse,
		SerializerFeature.WriteNullNumberAsZero,
		SerializerFeature.WriteNullListAsEmpty, 
		SerializerFeature.PrettyFormat
};

String str = JSONObject.toJSONString(data, features);
System.out.println(str);

输出:

{
	"bar":null,
	"foo":null,
	"num":null,
	"example":{
		"b":false,
		"i":0,
		"list":[],
		"s":""
	}
}
参考资料:

给JSON中put的value=null时,这对key=value会被隐藏掉。

JSON最佳实践