3

在处理某些值为空的 JSon 时,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}  
4

1 回答 1

6

更新:添加了 FreeMarker 2.3.31 ?eval_json。它可以解析null,但不能调用方法(这可能是 的安全问题?eval)。

不幸的是(或者......令人愤怒),FTL 不知道的概念null(尽管这可能会随着 2.4 改变)。因此,即使您设法从存在键但关联值存在的MapJSON创建一个(就像您在 Java 中创建一个这样的),仍然会失败。当然你可以写,但即使根本没有钥匙也会打印出来。因此,如果您在 JSON 评估期间为-s提供默认值,可能会更好:foonullMap${m.foo}${m.foo!'null'}nullfoonull

<#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(该 hack 很有用,因为 JSON 评估无法生成宏)...

于 2013-07-22T10:35:59.750 回答