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

我想借助模板引擎生成有效的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
  • 我还阅读了几个主题:

  • Java Template library similar to ZPT (attribute language)
  • Spring template engine for rendering JSON
  • 但是,到目前为止,我还没有找到令人满意的解决方案。

    背景信息:

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

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

    参考方案

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

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

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

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

    JSON PATH字段NULL检查表达式 - java

    我有一个像bellow的json数组:{ "store": { "book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sa…

    Java-搜索字符串数组中的字符串 - java

    在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…

    Java Scanner读取文件的奇怪行为 - java

    因此,在使用Scanner类从文件读取内容时,我遇到了一个有趣的问题。基本上,我试图从目录中读取解析应用程序生成的多个输出文件,以计算一些准确性指标。基本上,我的代码只是遍历目录中的每个文件,并使用扫描仪将其打开以处理内容。无论出于何种原因,扫描程序都不会读取其中的一些文件(所有UTF-8编码)。即使文件不是空的,scanner.hasNextLine()在…

    Java Globbing模式以匹配目录和文件 - java

    我正在使用递归函数遍历根目录下的文件。我只想提取*.txt文件,但不想排除目录。现在,我的代码如下所示:val stream = Files.newDirectoryStream(head, "*.txt") 但是这样做将不会匹配任何目录,并且返回的iterator()是False。我使用的是Mac,所以我不想包含的噪音文件是.DS_ST…

    Java RegEx中的单词边界\ b - java

    我在使用\b作为Java Regex中的单词定界符时遇到困难。对于text = "/* sql statement */ INSERT INTO someTable"; Pattern.compile("(?i)\binsert\b");找不到匹配项Pattern insPtrn = Pattern.compile(&…