使用JSON视图生成JSON

Ser*_*Amo 10 grails json json-view grails-3.0

我试图在Grails 3.1中使用JSON-Views.

我有以下控制器:

package myapp

BasketController {

    def index(ProductFilterCommand cmd) {

        [basketList: service.findAllBaskets()]
    }
}
Run Code Online (Sandbox Code Playgroud)

以下课程:

package myapp

class Basket {
    List<BasketItem> items
}

class BasketItem  {
    String name 
}
Run Code Online (Sandbox Code Playgroud)

这是我认为可以工作的gson文件:

篮/ index.gson

import myapp.Basket

model {
    Iterable<Basket> basketList
}

json.baskets(basketList) {
    g.render(template: "basket", model: [basket: it])
}
Run Code Online (Sandbox Code Playgroud)

篮/ _basket.gson

import myapp.Basket

model {
    Basket basket
}

json.items(basket.items) { 
    g.render(template: "item", model:[item: it])
}
Run Code Online (Sandbox Code Playgroud)

篮/ _item.gson

import myapp.Item

model {
    Item item
}

json g.render(item)
Run Code Online (Sandbox Code Playgroud)

我想生成json,例如:

{
    "baskets": [{
        "items": [{
            "name": "T-shirt"
        }, {
            "name": "Pants"
        }]
    }, {
        "items": [{
            "name": "T-shirt"
        }, {
            "name": "Pants"
        }]
    }]
}
Run Code Online (Sandbox Code Playgroud)

但相反,我得到:

{
  "baskets": [
    {},
    {}
  ]
}
Run Code Online (Sandbox Code Playgroud)

dma*_*tro 10

对我来说看起来像个错误.实现您所需要的唯一方法是使用如下所示的视图.另请注意使用collection而不是model.我会在下面测试的示例应用程序中提交一个错误.

请注意模板的用法作为完全限定名称basket/item.这是缺陷.

//index.gson
import com.example.Basket

model {
    Iterable<Basket> basketItems
}

json {
    baskets g.render(template: 'basket', collection: basketItems, var: 'basket')
}
Run Code Online (Sandbox Code Playgroud)

//_basket.gson
import com.example.Basket

model {
    Basket basket
}

json {
    items g.render(template: "basket/item", collection: basket.items, var: 'item')
}
Run Code Online (Sandbox Code Playgroud)

//_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
}*/
Run Code Online (Sandbox Code Playgroud)