使用Freemarker评估带有null值的JSon

时间:2013-07-22 01:53:00

标签: json jackson freemarker

当处理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}  

1 个答案:

答案 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评估不能产生宏)...