Freemarker中将字符串转换为数字number

本文分享了Freemarker模板使用中遇到的问题及解决方法,包括数值运算、空值判断、格式化显示等实用技巧。

<span style="font-size:18px;"><td>										
	<#if ts.settlementFlg == 1>
	<span style="white-space:pre">	</span>${(ts.orderAmount*(ts.settlementRate<span style="color:#ff0000;"><strong>?number</strong></span>))/1000}
													
	</#if>								
</td></span>

Freemarker只认类型相同的+ - * / %  

困扰了2天的Bug终于搞定了。

开心...o(∩_∩)o 


2.两个查询列表,List里面明明有值,但就是取不到,各种Debug 都没发现问题,最后搞了半天原来是实体里 没声明,没get set 笑了。这个故事告诉我们要细心。遇到Bug一定要淡定,不能自己乱阵脚,总会找出来的。


3.Freemarker 判断值是否为null 因为 当值为Null的时候Freemarker 找不到值 会报错,所以这个需要加上判断条件。

??

<td>
<#if ts.riskFee??>
${ts.riskFee?default('')/1000}
<#else>

</#if>
</td>

4.Freemarker  M2 、 m2

<td align="center"><span class="green">

#{qs.revenue?default(0);m2}</span></td>
<td align="center"><span class="red">#{qs.pay?default(0);m2}</span></td>
<td align="center">#{qs.balance?default(0);m2}</td>

mX:小数部分最小X位
MX:小数部分最大X位

例子:
<#assign x=2.582/>
<#assign y=4/>
#{x; M2} <#-- 输出2.58 -->
#{y; M2} <#-- 输出4 -->
#{x; m2} <#-- 输出2.6 -->
#{y; m2} <#-- 输出4.0 -->
#{x; m1M2} <#-- 输出2.58 -->
#{x; m1M2} <#-- 输出4.0 -->


<think>好的,我现在需要帮助用户解决在Freemarker中将JSON对象转换字符串的问题。首先,我得回顾用户之前的问题和我的回答,以及提供的站内引用,确保信息一致且准确。 用户之前询问过如何将数组转换字符串,我给出了使用`?join`的方法。现在他们的问题是关于JSON对象转字符串,所以可能需要不同的方法。根据提供的引用,尤其是引用3和5,用户提到了使用`?eval`将字符串转换为JSON对象,但反过来可能需要其他方法。 查看引用3,里面提到使用`?eval`来转换JSON字符串为对象,而引用5展示了如何解析JSON字符串访问其属性。这说明在Freemarker中,通常是将字符串转换为对象,而不是相反。但是用户现在需要的是将现有的JSON对象转回字符串,这可能涉及到序列化。 在Freemarker内置函数中,是否有直接将对象转为字符串的函数呢?根据我的知识,可能没有直接的函数。不过用户提供的引用4中,提到处理JsonNode时遇到的问题,可能需要手动处理引号。此外,引用2中提到使用`no_esc`来防止转义,这可能相关。 可能的解决方案包括: 1. 手动拼接字符串:使用`"`和`+`操作符,如`"{\"name\":\"" + obj.name + "\"}"`,但需要注意转义引号,容易出错。 2. 使用`?json`内建函数(需要确认是否存在):Freemarker 2.3.32版本之后可能支持`?json`来序列化对象为JSON字符串,自动处理转义。这可能是更简洁的方法,但需要用户确认版本是否支持。 3. 避免转义:使用`${...?no_esc}`来输出未转义的JSON字符串,但这需要原始数据已经是字符串形式,而不是对象。 根据引用2,用户曾遇到转义问题,使用`no_esc`解决,所以如果对象已经被正确序列化为字符串,使用`?no_esc`可以避免HTML转义。但如果是对象,可能需要先转换字符串。 因此,正确的步骤可能是:确保数据在Java层已经是JSON字符串,然后在模板中使用`?no_esc`输出,或者使用`?json`函数。例如,如果数据是Map或对象,可能需要通过Java代码先转为字符串,再传递到模板,或者在模板中使用`?json`处理。 需要检查用户提供的引用是否有相关方法。引用3中的`?eval`是反序列化,而引用5中的例子是解析JSON字符串,所以用户可能在模板中已经有一个对象,需要将其转为字符串。 总结可能的解决方案: - 使用`?json`函数(如果版本支持)。 - 在Java层将对象转为字符串再传入模板。 - 手动拼接字符串,注意转义。 此外,需要注意Freemarker的版本是否支持`?json`,因为不同版本的内建函数可能不同。如果用户版本较低,可能需要其他方法。 在回答中,应建议检查版本,提供不同方法,引用提供的参考资料,尤其是关于转义和`no_esc`的使用。</think>### Freemarker 将 JSON 对象转换字符串的方法 在 Freemarker 中**直接将 JSON 对象转换字符串**需要结合**数据源的特性**和**模板语法**共同实现。根据引用内容中的实践经验,以下是三种常见方法: --- #### 方法 1:通过 Java 层传递预序列化的 JSON 字符串(推荐) 如果 JSON 对象来源于 Java 后端,**优先在 Java 层将其序列化为字符串**再传递给模板[^3][^5]。例如: ```java // Java 代码中将对象转为 JSON 字符串 ObjectMapper mapper = new ObjectMapper(); String jsonStr = mapper.writeValueAsString(jsonObject); model.addAttribute("jsonString", jsonStr); ``` 在 Freemarker 模板中直接输出: ```html ${jsonString?no_esc} <#-- 使用 ?no_esc 避免 HTML 转义 --> ``` --- #### 方法 2:在模板中手动拼接 JSON 字符串 若无法修改 Java 层,可通过 Freemarker 的**字符串拼接语法**动态生成 JSON: ```html <#assign name = "John"> <#assign age = 25> { "user": "${name}", "age": ${age} } ``` 输出结果: ```json { "user": "John", "age": 25 } ``` **注意事项**: 1. 需手动处理双引号转义(如 `\"`)和特殊符 2. 使用 `${variable?json_string}` 可自动转义引号(需 Freemarker 2.3.32+ 版本) --- #### 方法 3:使用 `?eval` 反向操作(需谨慎) 如果已有 JSON 对象是通过 `?eval` 从字符串转换而来,可以**逆向还原原始字符串**: ```html <#-- 假设原始 JSON 字符串存储在 text 变量中 --> <#assign text = '{"key":"value"}'> <#-- 转换为对象 --> <#assign jsonObject = text?eval> <#-- 还原为字符串 --> 原始字符串:${text} ``` --- ### 关键问题解决方案 | 场景 | 解决方案 | 引用依据 | |-------|----------|---------| | JSON 字符串被 HTML 转义 | 使用 `?no_esc` 禁用转义 | [^2] | | 空值导致 JSON 格式错误 | 手动添加默认双引号 `\"\"` | [^4] | | 动态生成复杂 JSON 结构 | 优先在 Java 层序列化 | [^3][^5] | --- ### 完整示例 ```html <#-- 方法 1:直接输出预处理的 JSON 字符串 --> ${preSerializedJson?no_esc} <#-- 方法 2:动态拼接 --> <#assign items = ["apple", "banana"]> { "list": [ <#list items as item> "${item}"<#sep>,</#sep> </#list> ] } ``` ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值