Сериализация карты используя вид gson Grails - PullRequest
0 голосов
/ 16 марта 2020

Наш сервер создает карту FooCategory в качестве ключа, а значение представляет собой список Foo элементов. Поскольку контроллер добавляет это к модели для процесса рендеринга json, файл Grails gson выглядит следующим образом:

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

json {
  names names
  categories <<what is the syntax>>
}

После нескольких попыток я не могу получить действительную ссылку на список элементов Foo. Я хотел бы, например, сгенерировать json вывод следующим образом:

{
  "names": ["name1", "name2"],
  "categories": [
    {
      "name": "category_1",
      "fooCount": 5
    },
    {
      "name": "category_5",
      "fooCount": 8
    }
  ] 
}

Следующим шагом будет передача списка Foo элементов в шаблон с использованием синтаксиса tmpl.templateName(fooElements), но сейчас я Я просто остановился на атрибуте count. Любая помощь приветствуется!

1 Ответ

1 голос
/ 16 марта 2020

Я обнаружил, что представления Grails обрабатывают итерируемые объекты, используя tmpl, но поскольку Map не итеративна, мы должны явно вызвать метод 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
}

Теперь Iterable (categories.entrySet()) может быть передан шаблону, который будет выглядеть так:

model {
  Map.Entry<FooCategory, List<Foo>> entry
}

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

  ...
}
...