具有绑定功能的Java简易模板库

8
我希望通过模板引擎生成有效的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"}
        ]
      }
    ]
  }
}

请注意,引擎需要在必要时使用引号。
是否有任何模板库可以做到这一点,还是我需要自己编写库?
我已经研究了以下库:
- Freemarker - Velocity - Stringtemplate
我还阅读了几个帖子:
- 类似于ZPT(属性语言)的Java模板库 - 用于渲染JSON的Spring模板引擎
然而,到目前为止,我没有找到令人满意的解决方案。
背景信息:

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

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

1个回答

2
我找到了我的问题的答案:
我在模板中使用以下符号表示变量:$(json.path.to.value)。 我实现了一个自定义的Predicate,来自JayWay的JsonPath库,用于查找符合变量定义的JSON值。
Predicate还需要一个DocumentContext,它代表模型对象,从中应取出变量的值。该文档上下文是通过使用Jackson序列化模型对象并重新读取它来创建的JsonPath库。这样,可以确保插入模板的所有令牌都是有效的JSON令牌。
如果谓词找到一个变量,它会提取内容的JsonPath表达式,在提供的DocumentContext中查找新值,并覆盖原始JSON中的值。

很遗憾,抱歉。 - Thomas Eizinger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接