【发布时间】:2019-04-08 20:01:13
【问题描述】:
我无法让#evaluate 使用我见过的任何可接受的解决方案来设置变量,以便在 Confluence 中使用 Velocity 将 JSON 字符串转换为地图。
我有一个来自另一个系统的 JSON 字符串,用于生成动态数据。在开发过程中,我可以直接使用地图:
#set($textMapRaw = [{"ace":"clubs"}])
$textMapRaw.get(0).ace
最后一行呈现为“俱乐部”。
我曾期望使用#evaluate 将实时数据转换为对象数组。但是,当我对它执行任何操作时,#evaluate 似乎并没有将声明的变量放回范围。这是以字符串形式出现的同一张地图:
#set($textMapHtml = '[{"ace":"clubs"}]')
#set($evalHtml = '#set($myMapHtml = '+ $textMapHtml +')')
evalHtml = $evalHtml<br/>
#evaluate($evalHtml)
$myMapHtml.get(0).ace
最后一行呈现为“$myMapHtml.get(0).ace”。
我知道 $myMapHtml 正在被评估,因为当我没有将 Html 附加到它的末尾以避免 Confluence 的自动转义恶作剧时,我得到了一个评估堆栈跟踪。
我已经尝试过使用 ${hash}set 转义 set 中的哈希值。我试过单引号和双引号。我已经尝试通过评估设置一个字符串:
#evaluate('#set($dippity = "doo")')
$dippity
#set($hash = '#')
#evaluate("${hash}set($blue = 'moon')")
$blue
无论我对任何已批准的#evaluate 代码做什么,它都不会被评估到 Confluence 的范围内。我总是得到与未定义变量相同的结果。
注意:在我们的环境中,我无法在 Java 中解决问题并将其推送到模板中。我需要找到一个纯粹的模板内解决方案。
【问题讨论】:
-
如果我使用 Velocity 1.7 或 2.0 在我的测试环境中复制并粘贴您的代码,它可以工作...您使用的是哪个版本的 Velocity?
-
您是否在 Confluence 中执行此操作?这就是诀窍。我相信 Confluence 6.13 使用的是 Velocity 1.6.4。但这似乎是 Confluence 的问题。
标签: velocity confluence