问题如下:我想用JSON主体处理POST请求。主体由一组JSON对象组成,没有进一步的嵌套,即简单的HashMaps。所有这些对象都代表来自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)中间命令对象是否更合适?
答案 0 :(得分:0)
您的代码应该进入处理请求的控制器。请看一下 gson-grails plugin,其中包含如何序列化和反序列化对象以及将它们映射到域对象的示例。请查看grails基础知识,了解grails应用程序和布局中使用的约定。在grails网站上有很好的例子。希望这有帮助
答案 1 :(得分:0)
我根据allthenutsandbolts的评论提供的帮助解决了我的问题如下。 :(不需要Grails-Gson插件)
让 N2696AdminAction 成为域类的名称
在我的控制器中:
class N2696AdminActionController extends RestfulController{
static responseFormats = ['json', 'xml']
def JSONHandlerService
N2696AdminActionController() {
super(N2696AdminAction)
}
@Override
@Transactional
def save(){
if (request!=null)
JSONHandlerService.instancesfromJSON(request.JSON)
}
}
然后我将持久性委托给我的服务如下
class 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}",
true,Thread.currentThread()。getContextClassLoader())
def newDomainObject = domainClass.newInstance(it) newDomainObject.save(failOnError:true, flush:true, insert: true) }
} }
type 是一个Json属性,它包含我的类的完整(包含)名称。这样,我可以使用相同的POST请求保存到多个域类。