具有 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 绑定能力的简单模板库的主要内容,如果未能解决你的问题,请参考以下文章