嵌入式阵列的JSON对象保存在Controller中

时间:2012-03-18 05:33:38

标签: arrays json grails groovy

不确定如何从控制器中提取JSON数组。我有一个JSON对象,其中包含一个包含产品数组的订单。 JSON是这样嵌套的,但为了简洁起见,我减少了许多字段。

{ "customerId": "23",   "customerName": "Johnson",
    "products":[
    {
        "productId": "1",
        "finalPrice": "1.00"
    },
    {
        "productId": "2",
        "finalPrice": "2.00"
    },
    {
        "productId": "3",
        "finalPrice": "3.00"
    }
]}

然后我有一个控制器代码需要接受它并解析它并将其保存到两个表中... Orders和OrdersProducts。这是我到目前为止所做的,但不正确的是如何获取输入和循环每个项目并保存。

class OrdersController {
    def save = {
        def input = request.JSON

        def order = new Orders(input)
        order.save(flush:true)

        // Somehow I have to loop this for each item in array???
        def products = new OrdersProducts(input)
        products.ordersId = order.id

        products.save(flush:true)
        // ???????
    }   

}

----------我的解决方案----------

在从下面做出回答并根据我的特定需求进行修改(遗留数据库结构)之后,这就是我手动插入每个产品所做的:

OrdersController.groovy

import grails.converters.JSON
import grails.converters.XML

class OrdersController {
    def save = {
        def i
        def input = request.JSON

        def order = new Orders(input)
        if (order.save(failOnError:true)) {
            for (def products: input.ordersProducts) {
                def prod = new OrdersProducts(products)
                prod.ordersId = order.id

                if (prod.save(failOnError:true)) {
                //      
                } else {
                    prod.errors.allErrors.each { println it }
                }
            }
        } else {
            order.errors.each { println it }
        }
    }   
}

1 个答案:

答案 0 :(得分:1)

'订单'和'订单产品'是否相关?我猜它们是相关的,

static hasMany = [ordersProducts: OrderProducts]

在这种情况下,您可以将字符串解析为JSON,然后初始化对象

...
def j = grails.converters.JSON.parse(input)

def order = new Orders(j)
...

order.ordersProducts = j.products