当处理JSon时,某些值为null Freemarker在“eval。”中给出错误。
mapper.setSerializationInclusion(Inclusion.NON_NULL)
我可以避免这种情况,但我想念生成的JSon上的这些信息。
有一种方法可以用这个空值来实现评估吗?
<#assign test = "{\"foo\":\"bar\"}">
<#assign m = test?eval>
${m.foo} <#-- prints: bar -->
评估失败
<#assign test = "{\"foo\":null}">
<#assign m = test?eval> <#-- fail in eval -->
${m.foo}
答案 0 :(得分:5)
不幸的是(或......令人愤怒),FTL不知道null
的概念(虽然这可能会随着2.4而改变)。因此,即使您设法从该JSON创建Map
,其中foo
密钥存在但关联值为null
(就像您在Java中创建此类Map
一样), ${m.foo}
仍然会失败。当然你可以写${m.foo!'null'}
,但即使根本没有null
密钥,也会打印foo
。因此,如果在JSON评估期间为null
- s 提供默认值,可能会更好:
<#function parseJSON json>
<#local null = 'null'> <#-- null is not a keyword in FTL -->
<#return json?eval>
</#function>
${parseJSON("{\"foo\":null}").foo} <#-- prints null -->
但是,现在,您无法区分"null"
和null
之间的区别。如果这是一个问题,您可以选择一些奇怪的默认值,例如'@@@null'
或甚至使用宏作为指标值,然后使用?is_macro
来测试值是否为null
(该黑客是有用的因为JSON评估不能产生宏)...