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

时间:2015-11-15 13:49:52

标签: java json templates hypermedia

我想借助模板引擎生成有效的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的
  • 速度
  • StringTemplate的

我还阅读了几个主题:

然而,到目前为止,我找不到令人满意的解决方案。

背景资料:

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

这就是我想到使用模板生成输出并让用户编写模板然后将模型绑定到此模板以生成输出的原因。

1 个答案:

答案 0 :(得分:2)

我找到了一个问题的答案:

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

谓词还采用DocumentContext表示模型对象,应从中获取变量的值。通过使用Jackson序列化模型对象并使用JsonPath库重新读取它来创建此文档上下文。这样,确保插入模板中的所有令牌都是有效的JSON令牌。

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