Создание JSON с JSON-представлениями

Я пытаюсь использовать JSON-Views в Grails 3.1.

У меня есть следующий контроллер:

package myapp

BasketController {

    def index(ProductFilterCommand cmd) {

        [basketList: service.findAllBaskets()]
    }
}

И следующие классы:

package myapp

class Basket {
    List<BasketItem> items
}

class BasketItem  {
    String name 
}

Вот файлы gson, которые, как я думал, будут работать:

корзина/index.gson

import myapp.Basket

model {
    Iterable<Basket> basketList
}

json.baskets(basketList) {
    g.render(template: "basket", model: [basket: it])
}

корзина/_basket.gson

import myapp.Basket

model {
    Basket basket
}

json.items(basket.items) { 
    g.render(template: "item", model:[item: it])
}

корзина/_item.gson

import myapp.Item

model {
    Item item
}

json g.render(item)

Я хочу сгенерировать json, например:

{
    "baskets": [{
        "items": [{
            "name": "T-shirt"
        }, {
            "name": "Pants"
        }]
    }, {
        "items": [{
            "name": "T-shirt"
        }, {
            "name": "Pants"
        }]
    }]
}

Но вместо этого я получаю:

{
  "baskets": [
    {},
    {}
  ]
}

person Sergio del Amo    schedule 08.02.2016    source источник
comment
Basket, BasketItem — это доменные классы?   -  person dmahapatro    schedule 09.02.2016
comment
Спасибо @dmahapatro Это сработало отлично. Я принял твой ответ. Прости за мой запоздалый ответ. они не были классами предметной области, а просто классными классами.   -  person Sergio del Amo    schedule 10.02.2016
comment
Для POGO, в отличие от доменных классов, все эти церемонии и шаблоны не требуются, просто json { baskets basketList } в index.gson даст ожидаемый результат, отсюда и мой вопрос ранее. Очевидно, вам понадобится model dsl для BasketList. :)   -  person dmahapatro    schedule 10.02.2016


Ответы (1)


Похоже на ошибку для меня. Единственный способ добиться того, что вы ищете, — это использовать представления, как показано ниже. Также обратите внимание на использование collection вместо model. Я бы зарегистрировал ошибку в примере приложения, которое я использовал для тестирования ниже.

Обратите внимание на использование шаблона в качестве полного имени basket/item. Это недостаток.

//index.gson
import com.example.Basket

model {
    Iterable<Basket> basketItems
}

json {
    baskets g.render(template: 'basket', collection: basketItems, var: 'basket')
}

//_basket.gson
import com.example.Basket

model {
    Basket basket
}

json {
    items g.render(template: "basket/item", collection: basket.items, var: 'item')
}

//_item.gson
import com.example.BasketItem

model {
    BasketItem item
}

json g.render(item)

//or if id is not required in response
/*json {
    name item.name
}*/
person dmahapatro    schedule 09.02.2016
comment
У меня такая проблема с представлениями-1.1.5. Выполняется show.gson, и вывод json в порядке. Но index.gson, похоже, вообще не вызывается. У меня был System.out.println в index.gson для подтверждения. - person Umapathy; 16.02.2017