具有 Java 绑定能力的简单模板库

Posted

技术标签:

【中文标题】具有 Java 绑定能力的简单模板库【英文标题】:Simple template library with binding capability for Java 【发布时间】:2016-02-16 16:04:07 【问题描述】:

我想在模板引擎的帮助下生成有效的 JSON。特别是,我希望引擎将模板中的占位符替换为模型类的属性。 引擎应该允许对复杂类使用转换器,例如java.util.Date。 此外,我不想在模板本身中显式处理列表,而是希望任何类似集合的类型都能生成有效的 JSON 数组。

这可能是一个模板示例:


  "uber" :
  
    "version" : "1.0",
    "data" :
    [
      
        "rel" : $relations,
        "data" :
        [
          "name" : "firstname", "value" : $firstname,
          "name" : "lastname", "value" : $lastname
        ]
      
    ]
  

我想从具有关系、名字和姓氏属性的模型中替换此模板中的变量($relations$firstname$lastname)。这也适用于嵌套属性。 (例如:$address.street

绑定模型后,JSON 可能如下所示:


  "uber" :
  
    "version" : "1.0",
    "data" :
    [
      
        "rel" : ["person"],
        "data" :
        [
          "name" : "firstname", "label" : "Firstname", "value" : "Max",
          "name" : "lastname", "label" : "Lastname", "value" : "Mustermann"
        ]
      
    ]
  

请注意,引擎需要注意在必要时使用引号。

是否有任何模板库能够做到这一点,还是我需要推出自己的库?

我已经查看了以下库:

免费标记 速度 字符串模板

我还阅读了几个主题:

Java Template library similar to ZPT (attribute language) Spring template engine for rendering JSON

但是,到目前为止,我还没有找到令人满意的解决方案。

背景信息:

Uber 是与域无关的超媒体格式,它嵌套data 元素以对数据进行编码。 如果您想使用 Jackson 这样的库对其进行序列化,则这种格式的生成非常麻烦,因为您必须创建大量对象并通过 setter 嵌套它们,这会导致大量代码并且也很容易出错。

这就是为什么我想到使用模板来生成输出并让用户编写模板,然后将模型绑定到该模板以生成输出。

【问题讨论】:

【参考方案1】:

我找到了问题的答案:

我在模板中对变量使用以下表示法:$(json.path.to.value)。 我已经从 JayWay 的 JsonPath 库中实现了一个自定义 Predicate,它在 JSON 中查找符合变量定义的值。

谓词还接受一个DocumentContext,它代表模型对象,变量的值应该从中获取。此文档上下文是通过使用 Jackson 序列化模型对象并使用 JsonPath 库重新读取它来创建的。这样,可以确保插入到模板中的所有标记都是有效的 JSON 标记。

如果谓词找到变量,它会提取包含的 JsonPath 表达式,在提供的 DocumentContext 中查找新值并覆盖原始 JSON 中的值。

【讨论】:

很遗憾没有,抱歉。

以上是关于具有 Java 绑定能力的简单模板库的主要内容,如果未能解决你的问题,请参考以下文章

Win10系列:JavaScript 模板绑定

桌面端编程之通过C++的标准模板库代码快速提高编程能力

Epii.js 一个极其简单的Js模板引擎

Java HTML Builder(反模板)库? [关闭]

访问模板类的非模板库的静态数据

Win10系列:JavaScript 数据绑定