Json 序列化映射<;食品类别、列表<;Foo>&燃气轮机;使用gson-Grails视图

Json 序列化映射<;食品类别、列表<;Foo>&燃气轮机;使用gson-Grails视图,json,grails,serialization,groovy,gson,Json,Grails,Serialization,Groovy,Gson,我们的后端正在构建一个foocegory的映射作为键,其值是Foo元素的列表。由于控制器将此添加到json呈现过程的模型中,因此Grailsgson文件如下所示: model { List<String> names Map<FooCategory, List<Foo>> categories } json { names names categories <<what is the syntax>> } {

我们的后端正在构建一个
foocegory
的映射作为键,其值是
Foo
元素的列表。由于控制器将此添加到
json
呈现过程的模型中,因此Grails
gson
文件如下所示:

model {
    List<String> names
    Map<FooCategory, List<Foo>> categories
}

json {
  names names
  categories <<what is the syntax>>
}
{
  "names": ["name1", "name2"],
  "categories": [
    {
      "name": "category_1",
      "fooCount": 5
    },
    {
      "name": "category_5",
      "fooCount": 8
    }
  ] 
}
model {
  Map.Entry<FooCategory, List<Foo>> entry
}

json {
  FooCategory fooCategory = entry.key
  List fooElements = entry.value

  ...
}

下一步是使用
tmpl.templateName(fooElements)
语法将
Foo
元素的列表传递给模板,但现在我只是停留在count属性上。感谢您的帮助

我发现Grails的视图使用
tmpl
处理可Iterable实体,但由于Map不是可Iterable,我们必须显式调用
entrySet()
方法。这里有一个工作版本:

model {
    List<String> names
    Map<FooCategory, List<Foo>> categories
}

json {
  def stats = categories.entrySet().collect { cat ->
      [ name: cat.key.name, fooCount: cat.value.size() ]
  }

  names names
  categories stats
}

请注意:JSON只允许使用字符串键。根据FooCategory是什么,可能需要考虑如何表示数据。