【问题标题】:Looking for a template engine which supports JsonPath (Java)寻找支持 JsonPath (Java) 的模板引擎
【发布时间】:2021-06-07 12:05:51
【问题描述】:

我正在开发一个从 HTML 模板生成电子邮件的微服务(我们称之为电子邮件微服务)。基本上,客户端将带有一些数据的 json 发送到电子邮件微服务,并基于该数据生成电子邮件(使用 json 中的值填充 html 模板中的字段)。客户端是我们的另一个微服务,它准备好json发送到email微服务。

Json 结构是这样的:

{
   "data":{
      ......
   },
   .......
}
 

“数据”是可以包含不同事物的动态对象。所以我们可以用键值对填充它,例如,然后映射到 HashMap,然后使用这个 HashMap 填充我们的模板,使用一些模板引擎(Velocity、thymeleaf 或其他东西)。假设我们可以这样准备 json:

{
   "data":{
      "userName":"Jack"
   },
   .......
}
 

然后在模板中使用,类似这样:

<b> Hello {{userName}}! </b>

这种方法效果很好,但我想简化它,所以我们不需要每次都准备一个适当的 json (用键值对填充“数据”字段),而是我们只想放一些POJOs,不带我们需要哪些字段,然后在我们的模板中使用JsonPath来访问需要的数据。比如我们创建一个json:

{
   "data":{
      "user": {
          "firstName":"Jack",
          ..........
      },
      ...........
   },
   .......
}
 

然后在模板中写下这样的内容:

<b> Hello {{data.user.firstName}}! </b>

这会节省我们一些时间,因为我们不需要关心 json 结构。 是否有任何模板引擎可以使用 Json 作为输入并通过 JsonPath 访问值?所以我写了这样的东西:data.user.firstName,引擎会自动从给定的 json 中找到值。

【问题讨论】:

    标签: java html json spring-boot templates


    【解决方案1】:

    使用 Velocity 和 JsonPath 库解决了这个问题。

    我为 Velocity 创建了一个新工具:

    public class JsonPathTool {
    
        private final String json;
    
        public JsonPathTool(String json) {
            this.json = json;
        }
    
        public Object valueAt(String jsonPath) {
    
            jsonPath = "$." + jsonPath;                     
            return JsonPath.read(this.json, jsonPath);            
        }
    }
    

    然后我将JsonPathTool 放入Velocity 上下文中:

    VelocityContext ctx = new VelocityContext();
    JsonPathTool jsonPathTool = new JsonPathTool(json);
    ctx.put("data", jsonPathTool);
    

    在我的模板中,我使用以下语法:

    "<b> Hello $data.valueAt(\"user.firstName\") </b>"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      • 2020-10-31
      • 2016-01-24
      • 2023-03-25
      • 2014-09-19
      相关资源
      最近更新 更多