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"}
        ]
      }
    ]
  }
}

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

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

我已经查看了以下库:

  • 自由标记
  • 速度
  • 字符串模板

我还阅读了几个线程:

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

背景资料:

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

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

4

1 回答 1

2

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

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

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

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

于 2015-11-15T20:59:30.167 回答