![](/img/trans.png)
[英]How do I tell Spring to skip loading a Configuration class based on a property?
[英]How do I tell free marker to skip a <sep> directive in a list iteration?
我試圖在 Freemarker 的 <#list> 迭代中迭代 JSON 對象,並以不同的形式寫出相同的 JSON。 對於某些情況,我想跳過迭代而不寫出任何內容,但 Freemakrer 仍然寫出逗號,因為我使用了分隔符指令: <#sep>,</#sep>
。
例如
"<#list .data_model as key, value>" +
"<#if key == 'someVal1' || key == 'someVal2' || value?is_hash>" + //do nothing for these
"<#else>" +
"\"${key}\":\"${value?json_string?json_string}\"<#sep>,</#sep>" +
"</#if>" +
"</#list>"
輸出類似於:
{"aval1":"1",,"aval2":["item"], ...}
注意重復的逗號。
在其他地方,我已經實現了一些特殊的邏輯,我為前一項寫了一個逗號,只要當前項不是第一項。 該邏輯有效,但必須復制似乎很奇怪。
是否有針對這種情況的 Freemarker 內置插件?
<#sep>
(以及?has_next
、 ?index
等)假設您將呈現您列出的值中的所有項目。 具體來說, #sep
根據是否有下一個項目來決定的,而不是根據是否有前一個項目來決定的。 (回顧過去一般是行不通的,因為你不能總是推遲打印下一次迭代的分隔符,比如考慮<#sep>,</#sep></span>
。)所以要么你預過濾在 Java 中映射,否則您將需要一個變量來跟蹤元素是否已打印,然后在當前項目之前打印分隔符。
順便說一句,2.3.29(一周內發布)有?filter
來解決這種問題,但是,目前只支持過濾類似列表的值,不支持類似映射的值(可能在 2.3.30 中)。 因此,即使使用 2.3.29,您也必須列出鍵,然后在過濾器表達式中通過鍵獲取值,然后在嵌套內容中獲取值......不是很好。
找到了解決方法:
"<#assign x=false><#list .data_model as key, value>" +
"<#if key == 'someVal1' || key == 'someVal2' || value?is_hash>" + //do nothing for these
"<#else>" +
"<#if x>,</#if>\"${key}\":\"${value?json_string?json_string}\"<#assign x=true>" +
"</#if>" +
"</#list>"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.