文章目录
- 前言
- 编写引擎类:JsonTemplateEngine
- 编写模板类:CustomTemplate
- 编写测试代码
- 测试json文件
- 测试类
前言
由于百度搜索json模板引擎,推荐的都是一些freemarker之类的,需要引入其他的依赖,而且在编写json模板的时候使用${}
进行格式化的时候会把{}
当作json的格式进行格式化,导致json模板非常难看。
所以笔者基于hutool的TemplateUtil进行扩展,通过实现了TemplateEngine接口,CustomTemplate继承AbstractTemplate抽象类,来实现个性化的模板转换。
并且按照这样的写法,还可以自定义扩展其他的模板引擎格式,如${}
、$$
、#{}
等
编写引擎类:JsonTemplateEngine
package com.hx.core.jsonTemplate;import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.extra.template.Template;
import cn.hutool.extra.template.TemplateConfig;
import cn.hutool.extra.template.TemplateEngine;/*** 自定义模板引擎——引擎类*/
public class JsonTemplateEngine implements TemplateEngine {TemplateConfig cfg;private static final String PREFIX = "$";private static final String SUFFIX = "$";public JsonTemplateEngine() {}public JsonTemplateEngine(TemplateConfig cfg) {this.init(cfg);}@Overridepublic TemplateEngine init(TemplateConfig config) {if (null == config) {config = TemplateConfig.DEFAULT;}this.cfg = config;return this;}@Overridepublic Template getTemplate(String resource) {if (null == this.cfg) {this.init(TemplateConfig.DEFAULT);}StringBuilder stringBuilder = null;String path = this.cfg.getPath() + "\\" + resource;switch (this.cfg.getResourceMode()) {case CLASSPATH:stringBuilder = new StringBuilder(ResourceUtil.readStr(path, this.cfg.getCharset()));break;case FILE:stringBuilder = new StringBuilder(ResourceUtil.readStr(path, this.cfg.getCharset()));break;case WEB_ROOT:throw new RuntimeException("暂不支持的模板加载类型");case STRING:stringBuilder = new StringBuilder(resource);break;default:throw new RuntimeException("暂不支持的模板加载类型");}return new CustomTemplate(stringBuilder, PREFIX, SUFFIX);}}
编写模板类:CustomTemplate
package com.hx.core.jsonTemplate;import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.template.AbstractTemplate;import java.io.*;
import java.util.Map;/*** 自定义模板引擎——模板类*/
public class CustomTemplate extends AbstractTemplate implements Serializable {private StringBuilder stringBuilder;private String prefix;private String suffix;public CustomTemplate(StringBuilder stringBuilder, String prefix, String suffix) {this.stringBuilder = stringBuilder;this.prefix = prefix;this.suffix = suffix;}@Overridepublic void render(Map<?, ?> bindingMap, Writer writer) {for (Object key : bindingMap.keySet()) {String keyStr = StrUtil.concat(false, prefix, String.valueOf(key), suffix);String valStr = String.valueOf(bindingMap.get(key));int startIndex = stringBuilder.indexOf(keyStr);if (startIndex <= 0) continue;int endIndex = startIndex + keyStr.length();stringBuilder.replace(startIndex, endIndex, valStr);}try {writer.append(stringBuilder.toString());} catch (IOException e) {e.printStackTrace();}}@Overridepublic void render(Map<?, ?> bindingMap, OutputStream out) {// TODO}
}
编写测试代码
测试json文件
{"name": $name$,"text": $text$
}
测试类
package com.hx.core;import cn.hutool.core.lang.Dict;
import cn.hutool.extra.template.Template;
import cn.hutool.extra.template.TemplateConfig;
import cn.hutool.extra.template.TemplateEngine;
import cn.hutool.extra.template.TemplateUtil;
import com.hx.core.jsonTemplate.JsonTemplateEngine;public class Test1 {public static void main(String[] args) {//自动根据用户引入的模板引擎库的jar来自动选择使用的引擎//TemplateConfig为模板引擎的选项,可选内容有字符编码、模板路径、模板加载方式等,默认通过模板字符串渲染TemplateConfig config = new TemplateConfig();config.setCustomEngine(JsonTemplateEngine.class);TemplateEngine templateEngine = TemplateUtil.createEngine(config);Template template = templateEngine.getTemplate("hello $name$");//Dict本质上为Map,此处可用MapString result = template.render(Dict.create().set("name", "Huathy"));System.out.println("result = " + result);// 使用方式二TemplateConfig templateConfig = new TemplateConfig("", TemplateConfig.ResourceMode.CLASSPATH);TemplateEngine templateEngine2 = new JsonTemplateEngine(templateConfig);Template template2 = templateEngine2.getTemplate("test.json");String res2 = template2.render(Dict.create().set("name", "Huathy").set("text","这种方式的json文件格式化时不会乱码"));System.out.println("res2 = " + res2);}
}
输出: