从 freemarker 中的扩展哈希中检索值
Retrieving values from an extended hash in freemarker
我有一个如下所示的数据集:
{
"dataSet": [{
"@etag": "2020-02-21T09:11:19.408 ",
"text": "customer-old (ts001233)",
"archived": true,
"id": "932654d6-3f3b-452d-b256-66b9902a8952"
}, {
"@etag": "2021-12-21T21:12:13.648 ",
"text": "customer (ts001234)",
"archived": false,
"id": "932654d6-3f3b-452d-b256-66b9902a8952"
}, {
"@etag": "2021-12-17T21:07:36.587 ",
"text": "customer-test (ts001235)",
"archived": false,
"id": "85533cc2-320c-4d74-87e6-3233d26c8351"
}],
"templates": []
}
我正在尝试提取值“customer (ts001234)”,我可以使用以下代码执行此操作:
<#list dataSet as environments><#if environments.archived=false && !environments.text?contains('-test')>${environments.text}</#if></#list>
问题是此代码依赖于过滤文本值 (-test),我不想使用它,因为文本值可能会有所不同。相反,我想检索 first 非存档环境。
我尝试使用 ?first :
<#list dataSet as environments><#if environments.archived=false && !environments.text?contains('-test')>${environments?first.text}</#if></#list>
但这会导致错误:
For "?first" left-hand operand: Expected a sequence or collection, but this has evaluated to an extended_hash (LinkedHashMap wrapped into f.t.DefaultMapAdapter):
==> environments [in nameless template at line 1, column 119]
谁能给我一些关于如何在不过滤文本的情况下检索此值的指示?
假设 environments
对应于您示例中的 [{"@etag": ...}, ...]
,我猜您试图做的是:
<#assign firstUnarchived = environments?filter(it -> !it.archived)[0]>
如果您没有未归档的条目,这将失败。所以你可能只想将 environments?filter(it -> !it.archived)
分配给一个变量(没有 [0]
),比方说 unarchivedEnvs
,然后检查是否 unarchivedEnvs?size != 0
,等等
如果您使用的 FreeMarker 版本早于 2.3.29,您必须为此使用 #list
,当您找到与 #if
的第一个匹配项时,您可以退出用 <#break>
.
循环
我有一个如下所示的数据集:
{
"dataSet": [{
"@etag": "2020-02-21T09:11:19.408 ",
"text": "customer-old (ts001233)",
"archived": true,
"id": "932654d6-3f3b-452d-b256-66b9902a8952"
}, {
"@etag": "2021-12-21T21:12:13.648 ",
"text": "customer (ts001234)",
"archived": false,
"id": "932654d6-3f3b-452d-b256-66b9902a8952"
}, {
"@etag": "2021-12-17T21:07:36.587 ",
"text": "customer-test (ts001235)",
"archived": false,
"id": "85533cc2-320c-4d74-87e6-3233d26c8351"
}],
"templates": []
}
我正在尝试提取值“customer (ts001234)”,我可以使用以下代码执行此操作:
<#list dataSet as environments><#if environments.archived=false && !environments.text?contains('-test')>${environments.text}</#if></#list>
问题是此代码依赖于过滤文本值 (-test),我不想使用它,因为文本值可能会有所不同。相反,我想检索 first 非存档环境。
我尝试使用 ?first :
<#list dataSet as environments><#if environments.archived=false && !environments.text?contains('-test')>${environments?first.text}</#if></#list>
但这会导致错误:
For "?first" left-hand operand: Expected a sequence or collection, but this has evaluated to an extended_hash (LinkedHashMap wrapped into f.t.DefaultMapAdapter):
==> environments [in nameless template at line 1, column 119]
谁能给我一些关于如何在不过滤文本的情况下检索此值的指示?
假设 environments
对应于您示例中的 [{"@etag": ...}, ...]
,我猜您试图做的是:
<#assign firstUnarchived = environments?filter(it -> !it.archived)[0]>
如果您没有未归档的条目,这将失败。所以你可能只想将 environments?filter(it -> !it.archived)
分配给一个变量(没有 [0]
),比方说 unarchivedEnvs
,然后检查是否 unarchivedEnvs?size != 0
,等等
如果您使用的 FreeMarker 版本早于 2.3.29,您必须为此使用 #list
,当您找到与 #if
的第一个匹配项时,您可以退出用 <#break>
.