在我们的Grails应用程序中,我们的导航菜单是特定于客户端的,并作为JSON返回到我们的SPA。我们需要将这些菜单配置存储为人类可编辑文件,以便它们易于维护和跨客户端区分(它不是需要扩展的东西 - 我们说的不到10个自定义菜单)。
如果它是完全静态的,我们可以简单地使用JSON文件并完成它。
[
"id": 1,
"text": "Menu Item 1",
"children": [...],
, ...
]
但是,有一些最小的动态元素,我很好奇是否有像HTML那样的JSON模板库。
[{
"for": "user in users"
"userId": {{user.id}}
"text": "Nav Item 1",
"children": [
{
"parentUserId": {{user.id}}
"text": "Child Nav Item"
}
]},
, {...}, ...
]
输出:
[{
"userId": "bob"
"text": "Nav Item 1",
"children": [
{
"parentUserId": "bob"
"text": "Child Nav Item"
}
]
}, {
"userId": "admin"
"text": "Nav Item 1",
"children": [
{
"parentUserId": "admin"
"text": "Child Nav Item"
}
]
}
]
所以基本上要求是重复深度JSON对象(如角度'重复)并允许变量替换。如果简单地读取有效的JSON字符串并在其上运行类似FreeMarker的东西,变量替换会很容易,但是某些变量值可能是数字。
或者,由于我们正在使用Groovy / Grails,我们还可以将菜单存储为Groovy配置文件(尽管我还不太确定如何使用Groovy完成它)。
如果您有任何想法,我也会接受其他选择。
答案 0 :(得分:0)
在处理json文件之前,您可以将其视为groovy template:
def text = '''[
{
"id": 1,
"description": "Home",
},
{
"id": 2,
"description": "Receipts",
"children": [
{
"id": 3,
"description": "$receiptChild"
}
]
}
]'''
def engine = new groovy.text.SimpleTemplateEngine()
def data = [receiptChild: 'List all']
def template = engine.createTemplate text make data
def json = new groovy.json.JsonSlurper().parseText template.toString()
assert json[1].children[0].description == 'List all'
之后你可以正常将它作为json文件阅读。
答案 1 :(得分:0)
我现在意识到这个问题有点傻。您可以使用模板引擎而不仅仅是HTML。我给了Mustache一个镜头,它完美地呈现了JSON。 Mustache-Java提供了一个DecoratedCollection,您可以使用它来处理数组中的尾随逗号。
[
{{#users}}
{
"text": "{{$name}}",
"age": {{$age}}
}{{^last}},{{/last}}
{{/users}
]