gpt4 book ai didi

json - 在 Grails 2.3.3 中接收复杂的 json 对象

转载 作者:行者123 更新时间:2023-12-02 14:33:23 24 4
gpt4 key购买 nike

我有一个类似的问题:Grails get child domain objects

我将从链接中粘贴域类代码,以使帖子更具可读性:

class Parent{
String name
static hasMany = [childs:Child]
static constraints = {
}
}

class Child{
String name
static belongsTo = [parent:Parent]
static constraints={}
}

我已经为 Parrent 对象创建了自定义编码器,它产生如下所示的内容。
如何接收和保存一个复杂的 JSON 对象? (我想收到与 marshaller 为我生成的对象相同的对象)
[{"class":"project.Parent","id":1,"name":"name1",
"childs":[{"class":"Child","id":1,"name":"childname1"},
{"class":"Review","id":2,"name":"childname2"}
]
}]

除了 JSON,如果我有所有参数,比如“名称”等,我的应用程序中的默认保存代码是:
def parrent = new Parrent("parr_name") 
parrent.save()
def child = new Child("child_name", parrent)
child.save()

我必须单独发送 JSON 对象吗?还是我可以只接收复杂的 json 并拖出 args map ?以这种方式实现显示 JSON 的编码器是否能够接收类似格式的编码器?
我正在使用 grails v2.3.3

最佳答案

Grails 2.3.* 附带了一个重新定义的数据绑定(bind)框架,您可以在其中将 JSON 有效负载(大多数情况下来自 POST 请求)直接绑定(bind)到域类。

它的工作方式与您为响应 JSON 定制编码器相同。一路CommandObjects在早期版本的 Grails 中使用过,同样可以使用。以你自己的例子:

class Parent {
String name
static hasMany = [children:Child]
}

class Child {
String name
static belongsTo = [parent:Parent]
}

//In Controller
class ParentController {

//Directly binding the payload JSON to Parent domain class
//Caveat here is if the corresponding Parent domain matching the id in the
//payload is not found then "parent" parameter
//in the below action will be null
def save(Parent parent) {
println "Parent Data $parent"
println "Child Data $parent.children"

render "Parent Data $parent and child data $parent.children"

//or Do other stuff
}
}

//Assuming you have parent and child already present
class BootStrap {
def init = { servletContext ->
def parent = new Parent(name: "name1")

def child1 = new Child(name: "childname1")
def child2 = new Child(name: "childname2")

parent.addToChildren(child1)
parent.addToChildren(child2)

parent.save(flush: true, failOnError: true)
}
}

//and payload as
POST http://localhost:8080/YourApp/parent/save
Content-Type: application/json

{"class":"project.Parent","id":1,"name":"name1",
"childs":[{"class":"Child","id":1,"name":"childname1"},
{"class":"Child","id":2,"name":"childname2"}
]
}

//curl command like
curl -X POST
-H "Content-Type: application/json"
-d '{"class":"project.Parent","id":1,"name":"name1",
"childs":[{"class":"Child","id":1,"name":"childname1"},
{"class":"Child","id":2,"name":"childname2"}
]
}'
http://localhost:8080/YourApp/parent/save

您应该能够将 JSON 有效负载绑定(bind)到 Parent域(有 child )直接。如果您使用 url 参数而不是 JSON,则同样适用。

关于json - 在 Grails 2.3.3 中接收复杂的 json 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20545660/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com