如何使用Velocity模板将XML对象转换为JSON格式
Velocity模板实现XML转JSON实操方案
前置准备
- 提前将输入XML解析为Velocity上下文可访问的对象,常用Dom4j、JAXB等工具完成解析,将解析后的根节点放入上下文,命名为
$xmlRoot即可 - 封装XPath取值工具类放入Velocity上下文,命名为
$xpathUtil,简化模板内节点取值逻辑 - 建议将
org.apache.velocity.tools.generic.EscapeTool实例放入上下文,命名为$esc,用于处理JSON特殊字符转义
基础模板编写规则
1. 固定结构+动态取值
直接在模板中写JSON的固定外壳,需要动态取值的位置替换为Velocity变量即可,字符串类型字段需要加双引号,数值、布尔类型不需要加引号。
注意:所有字符串类型的取值都需要用
$esc.javaScript转义,避免双引号、换行、斜杠等特殊字符导致JSON格式非法。
单字段取值示例
假设XML结构为:
<order> <order_id>12345</order_id> <order_amount>99.9</order_amount> <order_remark>测试"备注"</order_remark> </order>
对应模板写法:
{ "orderId": "$esc.javaScript($xpathUtil.getText($xmlRoot, "//order/order_id"))", "orderAmount": $xpathUtil.getText($xmlRoot, "//order/order_amount"), "orderRemark": "$!esc.javaScript($xpathUtil.getText($xmlRoot, "//order/order_remark"))" }
空值场景用
$!{变量名}语法,变量为空时输出空字符串而非Velocity变量标识。
2. 列表循环写法
如果需要解析XML中的重复节点生成JSON数组,用#foreach指令循环处理,通过$foreach.index判断是否加逗号,避免数组末尾多余逗号导致JSON非法。
列表字段示例
假设XML包含商品列表节点:
<order> <order_id>12345</order_id> <goods_list> <goods> <goods_id>1</goods_id> <goods_name>测试商品1</goods_name> </goods> <goods> <goods_id>2</goods_id> <goods_name>测试商品2</goods_name> </goods> </goods_list> </order>
对应模板写法:
{ "orderId": "$esc.javaScript($xpathUtil.getText($xmlRoot, "//order/order_id"))", "goodsList": [ #set($goodsNodes = $xpathUtil.getNodes($xmlRoot, "//order/goods_list/goods")) #foreach($goods in $goodsNodes) #if($foreach.index > 0),#end { "goodsId": "$esc.javaScript($xpathUtil.getText($goods, "goods_id"))", "goodsName": "$esc.javaScript($xpathUtil.getText($goods, "goods_name"))" } #end ] }
3. 嵌套结构处理
多层嵌套XML节点的处理逻辑和单节点、列表逻辑完全一致,逐层取出对应节点输出即可,不需要额外特殊处理。
内容的提问来源于stack exchange,提问作者Amit Kumar
相关产品推荐
相关产品推荐

