问题如下:我想处理一个JSON体POST请求。主体由一个JSON对象数组组成,没有进一步嵌套,即简单的hashmap。所有这些对象都表示来自Android应用程序的JSON序列化的域类,它们将在我的Grails应用程序中有对应的对象。我正在考虑解析JSON主体,遍历每个元素并将每个节点保存为其相应的域类实例。
a)如何保存实例?我是Grails/Groovy的新手,所以请原谅任何巨大的错误。目前的代码是
public static Object JSONArray2Instances(String json, Class type) {
def slurper = new JsonSlurper()
def result = slurper.parseText(json)
//we only want to parse JSON Arrays
if (!(result instanceof JSONArray))
return null
result.each {
def instance = it.asType(type)
// now I need to save to domain class!
}
}
b)我在哪里放置相应的代码?目前它在/grails-app/src/groovy中。测试结果在哪里?(因为它不是一个"真正的"Grails组件)
c)中间命令对象是否更合适?
您的代码应该进入处理请求的控制器。请看一看Gson-grails插件,其中有如何序列化和反序列化对象并将其映射到域对象的示例。请查看grails基础,其中讨论了grails应用程序和布局中使用的约定。在grails网站上有很好的例子。希望对大家有所帮助
根据来自allthenutsandbolts的评论提供的帮助,我解决了我的问题如下。:(Grails-Gson插件不需要)
让N2696AdminAction为域类的名称
in my controller:
class N2696AdminActionController extends RestfulController{
static responseFormats = ['json', 'xml']
def JSONHandlerService
N2696AdminActionController() {
super(N2696AdminAction)
}
@Override
@Transactional
def save(){
if (request!=null)
JSONHandlerService.instancesfromJSON(request.JSON)
}
}
那么我将持久化委托给我的服务,如下所示
类JSONHandlerService {
def instancesfromJSON(Object request){ //we only want to parse JSON Arrays if (!(request instanceof JSONArray)) return null request.each { def domainClass = Class.forName("${it.type}",
真的,Thread.currentThread () .getContextClassLoader ())
def newDomainObject = domainClass.newInstance(it) newDomainObject.save(failOnError:true, flush:true, insert: true) }
}}
type是一个Json属性,它包含我的类的完整(包括包)名称。这样,我可以保存多个域类与相同的POST请求。