原始数据
{
"name1": "",
"name2": null,
"list1": [],
"list2": null
}
模板代码
1.??
属性不存在或者属性为null时返回false
${name1???string} <#--true-->
${name2???string} <#--false-->
${name3???string} <#--false-->
${list1???string} <#--true-->
${list2???string} <#--false-->
${list3???string} <#--false-->
2.has_content
与??的区别是:增加排除空串或者空集合的能力
${name1?has_content?string} <#--false-->
${name2?has_content?string} <#--false-->
${name3?has_content?string} <#--false-->
${list1?has_content?string} <#--false-->
${list2?has_content?string} <#--false-->
${list3?has_content?string} <#--false-->
3.!
相当于三目运算符,通过??判断后,有值就用原始数据的值没有就使用!后面的值(!后面没值使用空)
${name1!123} <#--空串-->
${name2!123} <#--123-->
${(list1![1,2])?size} <#--0-->
${(list2![1,2])?size} <#--2-->
4.if_exists
??的旧表达式,不要使用,输出结果很模糊,可以自行测试
参考
Difference between ?? , has_content , if_exists in freemarker