Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Evaluate JSon with null value using Freemarker

When dealing with a JSon that some values are null Freemarker give an error in ?eval.

with mapper.setSerializationInclusion(Inclusion.NON_NULL) i can avoid this but i miss this information on the generated JSon.

There's a way to achieve the evaluation with this null values?

<#assign test = "{\"foo\":\"bar\"}">
<#assign m = test?eval>
${m.foo}  <#-- prints: bar -->

Fail in eval

<#assign test = "{\"foo\":null}">
<#assign m = test?eval> <#-- fail in eval -->
${m.foo}  
like image 233
Ruben Trancoso Avatar asked Jul 08 '26 01:07

Ruben Trancoso


1 Answers

Update: FreeMarker 2.3.31 added ?eval_json. It can parse null, and can't call methods (which is a possible security issue with ?eval).

Unfortunately (or... infuriatingly), FTL doesn't know the concept of null (although this might will change with 2.4). So even if you manage to create a Map from that JSON where the foo key exists but the associated value is null (like you create a such Map in Java), ${m.foo} will still fail. Surely you can write ${m.foo!'null'}, but that will print null even if there's no foo key at all. So maybe it's better if you provide a default value for the null-s during the JSON evaluation:

<#function parseJSON json>
  <#local null = 'null'> <#-- null is not a keyword in FTL -->
  <#return json?eval>
</#function>

${parseJSON("{\"foo\":null}").foo}  <#-- prints null -->

Now, however, you can't tell the difference between "null" and null. If that's a problem, you could chose some odd default, like '@@@null' or even use a macro as indicator value and then use ?is_macro to test if the value was null (that hack is useful as JSON evaluation can't produce macros)...

like image 155
ddekany Avatar answered Jul 13 '26 19:07

ddekany



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!