Tho*_*ger 8 java templates json hypermedia
我想借助模板引擎生成有效的JSON.特别是,我希望引擎用模型类的属性替换模板中的占位符.引擎应该允许使用转换器来处理复杂的类java.util.Date.另外,我不想显式处理模板本身的列表,而是希望任何类似集合的类型生成有效的JSON数组.
这可能是模板的一个示例:
{
"uber" :
{
"version" : "1.0",
"data" :
[
{
"rel" : $relations,
"data" :
[
{"name" : "firstname", "value" : $firstname},
{"name" : "lastname", "value" : $lastname}
]
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
我想替换的变量($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"}
]
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,必要时引擎需要使用引号.
是否有任何模板库能够执行此操作,还是需要滚动自己的库?
我已经查看了以下库:
我还读了几个帖子:
但是,到目前为止,我找不到令人满意的解决方案.
背景资料:
优步是与域无关的超媒体格式,它嵌套data元素以编码数据.如果你想用像Jackson这样的库来序列化这种格式是非常麻烦的,因为你必须创建很多对象并通过setter嵌套它们会导致很多代码并且也非常容易出错.
这就是我想到使用模板生成输出并让用户编写模板然后将模型绑定到此模板以生成输出的原因.
我找到了我的问题的答案:
我在模板中使用以下变量表示法:$(json.path.to.value)。我已经Predicate从JayWay 的JsonPath库中实现了一个自定义,它在 JSON 中查找符合变量定义的值。
谓词还采用DocumentContext代表模型对象的 ,应从中获取变量的值。该文档上下文是通过使用 Jackson 序列化模型对象并使用 JsonPath 库重新读取它来创建的。这样,可以确保插入到模板中的所有令牌都是有效的 JSON 令牌。
如果谓词找到变量,它会提取包含的 JsonPath 表达式,在提供的值中查找新值DocumentContext并覆盖原始 JSON 中的值。