使用JSON-Views生成JSON

10

我正在尝试在Grails 3.1中使用JSON-Views

我有以下控制器:

package myapp

BasketController {

    def index(ProductFilterCommand cmd) {

        [basketList: service.findAllBaskets()]
    }
}

还有以下的课程:

package myapp

class Basket {
    List<BasketItem> items
}

class BasketItem  {
    String name 
}

这里是我认为能够正常工作的gson文件:

basket/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])
}

篮子/_物品.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": [
    {},
    {}
  ]
}

BasketBasketItem - 它们是领域类吗? - dmahapatro
1
谢谢@dmahapatro,它完美地解决了问题。我已经接受了你的答案。抱歉回复晚了,它们不是领域类,只是普通的Groovy类。 - Sergio del Amo
1
对于 POGO,与域类不同的是,所有这些仪式和模板都不是必需的,只需在 index.gson 中使用 json { baskets basketList } 即可得到预期结果,因此我之前提出了问题。当然,你需要为 basketList 使用 model dsl。 :) - dmahapatro
1个回答

10

看起来对我来说是个bug。实现您所寻找的唯一方法是使用以下所示的视图。还请注意使用collection而不是model。我会在下面用于测试的示例应用程序中提出一个bug。

请注意将模板作为完全限定名称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
}*/

我在使用views-1.1.5时遇到了问题。show.gson被执行并且json输出很好,但是index.gson似乎根本没有被调用。我在index.gson中放置了System.out.println以进行确认。 - Umapathy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接