在 Freemarker 中将字符串转换为 JSON

Posted

技术标签:

【中文标题】在 Freemarker 中将字符串转换为 JSON【英文标题】:Convert string to JSON in Freemarker 【发布时间】:2016-05-27 15:40:45 【问题描述】:

我们如何将VALID JSON STRING 转换为freemarker 中的实际JSON(序列)的任何方法。我的意思是这个字符串实际上是由JSON.stringify() 调用返回的。

我遵循post 所说的内容,但似乎这不适用于我的。

<#assign test = "(record.custpage_lineitems?json_string)">
<#assign m = test?eval>

<#list m as k>
    $k.item
</#list>
ERROR says
Expected collection or sequence. m evaluated instead to freemarker.template.SimpleScalar on line 286, column 32 in template.
Sample JSON String

"34952": 
    "item": "TRAVEL",
    "notes": "Travel Time To Client Site to Perform Repairs.1.0",
    "type": "Service"
,
"34963": 
    "item": "MECHANIC RECOMMENDATION",
    "notes": "MECHANIC RECOMMENDATION\nr&r drive tires 21x7x15 smooth black \nr&r lp tank latch on bracket \nr&r lp hose cupler",
    "type": "Service"
,
"9938": 
    "item": "T1",
    "notes": "Field Service Call Charge75$ labor 124$",
    "type": "Service"
,
"34549": 
    "item": "GENERAL SERVICE INFO",
    "notes": "SERVICE NOTES:\ndrove to customer location found lift found to broken hydraulic hoses had to remove attachment in order to remove broken hoses then drove to get hoses made installed hoses back on lift re installed loose brackets I found out attachment back on lift topped off hydraulic resivoir and lift was ready",
    "type": "Service"
,
"36264": 
    "item": "FSO PARTS (UN CHECK IF NEEDED)",
    "notes": "MARK CHECK IF PARTS NOT NEEDED.",
    "type": "Service"
,
"36266": 
    "item": "FSO QUOTE (UN CHECK IF NEEDED)",
    "notes": "MARK CHECK IF QUOTE NOT NEEDED.",
    "type": "Service"
,
"29680": 
    "item": "0199992-HY32F",
    "notes": "2 x 0199992-HY32F",
    "type": "Inventory Item"

它似乎没有转换为有效序列,因为如果我尝试打印 $m 它会显示转义的 json 字符串。

我正在寻找一种我只会说 &lt;#assign test=toJSON(record.custpage_lineitems) 的方法,但我认为你必须在 java 中编写方法,因为我在“netsuite”中这样做

更新:我尝试对 json 字符串进行硬编码,例如

<#assign m = '"34952":"item":"TRAVEL","notes":"Travel Time To Client Site to Perform Repairs.1.0","type":"Service"....'>

并尝试循环,它似乎工作。但是,如果我将 m 的值替换为 myvariable 似乎不起作用。我 100% 确定 myvariable 不为 null 也不为空,但包含相同的 JSON 字符串。

我的评估是,如果我可以将myvariable 包装成single quote,那么我认为它会解决问题。我试过了

<#assign m = 'myvariable'> and
<#assign m = '(myvariable)'> and 
<#assign m = '($myvariable)'> and 
<#assign m = '(myvariable?string)'> etc.

但没有一个是正确的。有人可以指导我了解如何将现有变量包装为单引号的正确语法。

有帮助吗?谢谢。

【问题讨论】:

【参考方案1】:

如果您的 record.custpage_lineitems 已经是字符串化 JSON,那么您不必使用 ?json_string

将前两行替换为:

<#assign m = record.custpage_lineitems?eval>

有关详细信息,请参阅eval 文档。


更新: 您的 custpage_lineitems 是一个哈希映射并且 #list 接受序列。试试这个:

<#list m?keys as k>
    $m[k].item
</#list>

【讨论】:

我已经尝试过了。我只是输入?json_string 来测试帖子所说的内容,但也没有用。这与我遇到的错误相同,因此我怀疑该字符串未转换为有效的 freemarker 序列。你还有什么其他的想法吗?谢谢。 record.custpage_lineitems 的初始值粘贴到您的问题中,这样我就可以看到它的样子。也许 JSON 包含一些不需要的字符。 正如我所说,它是由JSON.stringify() 返回的。谢谢 您不必将变量包装成单引号。当您编写&lt;#assign m = 'bla'&gt; 时,变量m 包含字符串bla 而不是'bla'。如果您的record.custpage_lineitems 是以 开头的字符串,那么在eval 之后它应该是正确的对象/哈希。【参考方案2】:

我认为 json 字符串中的 \n 可能会导致一些问题。尝试先将其替换为(或适合您需要的类似内容)

record.custpage_lineitems?replace("\n", "\\n")

然后然后eval

【讨论】:

好点,但我刚刚尝试过,我也手动删除了\n,但没有运气。

以上是关于在 Freemarker 中将字符串转换为 JSON的主要内容,如果未能解决你的问题,请参考以下文章

如何在freemarker中将日期转换为字符串?

在 FreeMarker 中测试字符串是不是可以转换为数字

如何在NetSuite中将一个Freemarker模板转换为另一个模板?

如何在 freemarker 语言中将当前日期格式(YYYY-MM-DD HH:MM:SS)转换为(YYMMDD)格式

将 freemarker 对象呈现为 JSON 的最简单方法是啥?

使用 USCavalry 转换器将 Velocity 模板转换为 FreeMarker