JSON模板库 - 将动态元素添加到静态JSON文件

时间:2016-07-20 16:17:33

标签: json grails groovy

在我们的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完成它)。

如果您有任何想法,我也会接受其他选择。

2 个答案:

答案 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}
]