3

一部の値が null である JSON を処理する場合、Freemarker は ?eval でエラーを返します。

これをmapper.setSerializationInclusion(Inclusion.NON_NULL)回避できますが、生成された JSON に関するこの情報がありません。

この null 値で評価を達成する方法はありますか?

<#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 で変更される可能性がありますが) の概念を知りません。そのため、キーは存在するが関連付けられた値がMapある JSON からを作成できたとしても ( 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ことができます (JSON 評価ではマクロを生成できないため、このハックは役立ちます)...

于 2013-07-22T10:35:59.750 に答える