簡體   English   中英

我如何告訴自由標記跳過<sep>列表迭代中的指令?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM