Velocity如何对变量中的引号特殊字符进行转义

简介

Velocity是一个基于Java的模板引擎,与Freemarker类似。相较于Freemarker更轻量,但带来的问题就是功能不如Freemarker强大,所以实际项目中可能会更倾向于用Freemarker,这里不作过多介绍了,本文主要记录一下在使用中碰到的要对引号特殊字符进行转义的问题。

问题背景

项目应用中使用了Velocity,但是其中的一个模板在执行时会报错,模板如下:

["${content}",${scene_id}]

当content的值中含有特殊字符时,由于本身是List格式,在将变量替换后,会因为变量中的特殊字符导致转换JSON报错。比如

String content = "etsl\"hesaid.\"iathisis";

执行后会报错:

Exception in thread "main" com.alibaba.fastjson.JSONException: syntax error, pos 8, json : ["etsl"hesaid."iathisis",59]at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1436)at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1322)at com.alibaba.fastjson.parser.DefaultJSONParser.parseArray(DefaultJSONParser.java:1206)at com.alibaba.fastjson.parser.DefaultJSONParser.parseArray(DefaultJSONParser.java:1111)at com.alibaba.fastjson.JSON.parseArray(JSON.java:508)

由于Velocity功能不够强大,不能像Freemarker那样用自带的函数对特殊字符进行处理。

解决方法

后来经过查找资料,了解到Velocity有拓展工具类(org.apache.velocity.tools.generic.EscapeTool),查看EscapeTool类的源码,可以发现该类中包含了很多工具方法,比如针对html,js等语言,也有对应的转义方法。当前问题可以使用其中的org.apache.velocity.tools.generic.EscapeTool#java方法来解决。

引入依赖:

		<!-- https://mvnrepository.com/artifact/org.apache.velocity.tools/velocity-tools-generic --><dependency><groupId>org.apache.velocity.tools</groupId><artifactId>velocity-tools-generic</artifactId><version>3.1</version></dependency>

将template修改为: 

String template = "[\"$esc.java(${content})\",${scene_id}]";

并且在创建VelocityContext对象时,将工具类加载进去:

        // 创建VelocityContext对象VelocityContext context = new VelocityContext();// 向VelocityContext中添加变量context.put("content", content);context.put("scene_id", 59);// 添加自定义工具类context.put("esc", new EscapeTool());

问题得到解决。

完整代码如下:

    public static void main(String[] args) throws Exception {String template = "[\"$esc.java(${content})\",${scene_id}]";String content = "etsl\"hesaid.\"iathisis";System.out.println(content);// 初始化Velocity引擎Velocity.init();// 创建VelocityContext对象VelocityContext context = new VelocityContext();// 向VelocityContext中添加变量context.put("content", content);context.put("scene_id", 59);// 添加自定义工具类context.put("esc", new EscapeTool());// 合并模板和VelocityContextStringWriter writer = new StringWriter();Velocity.evaluate(context, writer, "Velocity Example", template);// 输出结果String params = writer.toString();System.out.println(params);JSONArray jsonArray = JSONObject.parseArray(params);System.out.println(jsonArray);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/2277.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国内流行的数据可视化软件工具

在信息爆炸的时代&#xff0c;越来越多的数据堆积如山。但是&#xff0c;这些密集的数据没有重点且可读性较差。因此&#xff0c;我们需要数据可视化来帮助数据易于理解和接受。相比之下&#xff0c;可视化更直观、更有意义&#xff0c;使用适当的数据可视化工具来可视化数据非…

golang整合kafka

kafka 基本概念 消息队列 1、什么是消息队列 消息&#xff08;Message&#xff09;是指在应用之间传送的数据&#xff0c;消息可以非常简单&#xff0c;比如只包含文本字符串&#xff0c;也可以更复杂&#xff0c;可能包含嵌入对象。 消息队列&#xff08;Message Queue&…

SDN系统方法 | 1. 概述

随着互联网和数据中心流量的爆炸式增长&#xff0c;SDN已经逐步取代静态路由交换设备成为构建网络的主流方式&#xff0c;本系列是免费电子书《Software-Defined Networks: A Systems Approach》的中文版&#xff0c;完整介绍了SDN的概念、原理、架构和实现方式。原文: Softwar…

基于FT232HL的USB2.0转ARINC429板卡

基于FT232HL的USB2.0转ARINC429板卡 1 概述 《USB2.0转ARINC429板卡》采用底板子板&#xff0c;层叠安装的结构&#xff1b;使用同样的底板&#xff0c;变换不同功能的子板实现不同的功能版本。 a) 降低硬件设计复杂度&#xff1a;新板卡设计只需要设计子板&#xff0c;子板的…

MySQL中这14个小玩意,让人眼前一亮!!!

前言 我最近几年用MYSQL数据库挺多的&#xff0c;发现了一些非常有用的小玩意&#xff0c;今天拿出来分享到大家&#xff0c;希望对你会有所帮助。 1.group_concat 在我们平常的工作中&#xff0c;使用group by进行分组的场景&#xff0c;是非常多的。 比如想统计出用户表中…

《动手学深度学习》(pytorch版本)中`d2lzh_pytorch`包问题

《动手学深度学习》&#xff08;pytorch版本&#xff09;中d2lzh_pytorch包问题

机器视觉检测系统不稳定因素分析

机器视觉的研究始于20世纪50年代二维图像的模式识别,它起初被设计用来代替人眼从事检测识别的工作,可以大大提高检测的工作效率以及降低人眼疲劳带来的检测结果的不一致性。机器视觉检测发展至今,在许多方面已经发展到可以完成人眼难以完成的工作,如高精度的测量以及对特定…

倍福TwinCAT运动控制学习资料

学习倍福控制器和EtherCAT协议的时候&#xff0c;TwinCAT3是非常有必须要学习的。TwinCAT软件其功能强大&#xff0c;可以写plc程序&#xff0c;可以写图形化界面&#xff0c;可以观察波形等等。初次学习时参考TwinCAT3 入门教程和TwinCAT 3运动控制教程&#xff0c;把TwinCAT …

【深度学习】张量的广播专题

一、说明 张量广播&#xff08;tensor broadcasting&#xff09;是一种将低维张量自动转化为高维张量的技术&#xff0c;使得张量之间可以进行基于元素的运算&#xff08;如加、减、乘等&#xff09;。在进行张量广播时&#xff0c;会将维度数较少的张量沿着长度为1的轴进行复制…

YOLOv5图像和视频对象生成边界框的目标检测实践(GPU版本PyTorch错误处理)

识别图像和视频里面的对象&#xff0c;在计算机视觉中是一个很重要的应用&#xff0c;比如无人驾驶&#xff0c;这个就需要实时的检测到周边环境的各种对象&#xff0c;并及时做出处理。目标检测在以往的文章中有重点讲解过几种&#xff0c;其中Faster R-CNN的源码解读&#xf…

7.kafka+ELK连接

文章目录 kafkaELK连接部署Kafkakafka操作命令kafka架构深入FilebeatKafkaELK连接 kafkaELK连接 部署Kafka ###关闭防火墙systemctl stop firewalld systemctl disable firewalldsetenforce 0vim /etc/selinux/configSELINUXdisabled###下载安装包官方下载地址&#xff1a;ht…

Vue自定义指令

需求1&#xff1a;定义一个v-big指令&#xff0c;和v-text功能类似&#xff0c;但会把绑定的数值放大10倍。 需求2&#xff1a;定义一个v-fbind指令&#xff0c;和v-bind功能类似&#xff0c;但可以让其所绑定的input元素默认获取焦点。 自定义指令函数式v-big&#xff1a; &l…

java设计模式之 - 建造者模式

建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它通过将对象的构建过程分离出来&#xff0c;使得同样的构建过程可以创建不同的表示形式。 简单来说&#xff0c;建造者模式允许你按步骤创建复杂的对象&#xff0c;同时将对象的构建与其表…

Python爬虫相关案例汇总

一、简述 将之前所做的爬虫案例放出&#xff0c;方便查阅&#xff0c;对代码整合函数内容并不进行说明。 二、代码 import time from concurrent.futures import ThreadPoolExecutorimport requests import re import csv from bs4 import BeautifulSoup import os from lxm…

Go新手速成-string

1string类型 byte就是unit8 rune就是int32 都可以代表字符型&#xff0c;但是必须格式化打印&#xff0c;要不然打印出来就是ASC码&#xff0c;参考c语言 //字符处理的细节&#xff0c;如果是英文意味着比较短&#xff0c;可以用byte来实现&#xff0c;//如果是汉字就可以用…

2023最新版本Activiti7系列-事件篇

事件篇 事件&#xff08;event&#xff09;通常用于为流程生命周期中发生的事情建模。事件总是图形化为圆圈。在BPMN 2.0中&#xff0c;有两种主要的事件分类&#xff1a;*捕获&#xff08;catching&#xff09;与抛出&#xff08;throwing&#xff09;*事件。 捕获: 当流程执…

文件共享服务器

文章目录 一、共享服务器概述二、创建共享三、访问共享四、创建隐藏的共享五、访问隐藏共享的方法六、共享相关命令七、屏蔽系统隐藏共享自动产生1. 打开注册表2. 定位共享注册表位置 八、查看本地网络连接状态&#xff08;查看开放端口&#xff09;九、关闭445服务 一、共享服…

数据结构问答1

1. 当数据采用链式存储结构时,要求————? 答:每个节点占用一片连续的存储区域 2. 简述数据与数据元素的关系与区别? 答: 关系: 凡是能输入到计算机并被计算机识别和处理的对象集合都称为数据,数据是一个集合。数据元素是数据的基本单位,在计算机程序中通常作为…

List迭代器是如何实现的

我们知道当我们使用vector的迭代器时,它的操作可以让它指向下一个位置,解引用操作就可以找到这个位置的值,因为vector底层时用的一个顺序表,可以支持随机访问。对比list来说vector底层的迭代器是十分的简便可观的。虽然我们使用list的迭代器外观上和vector是大同小异的&#xf…