我想借助模板引擎生成有效的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嵌套它们,这会导致大量代码,而且也很容易出错。
这就是为什么我考虑使用模板来生成输出,然后让用户编写模板,然后将模型绑定到该模板以生成输出的原因。
参考方案
我找到了我的问题的答案:
我对模板中的变量使用以下表示法:$(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(&…