在Grails 2.5.X应用程序中,我可以直接将请求数据绑定到Map
类型的命令对象字段,如下所示:
class MyController {
def myAction(Command command) {
Map requestData = command.data
}
}
class Command {
Map data
}
似乎内部Grails使用Gson来解析JSON数据。例如,如果请求数据为{"page": 6}
,则相应的Map
将为
[page: new LazilyParsedNumber(6)]
即。存储在Map
中的值是com.google.gson.internal.LazilyParsedNumber
的实例。
这对我来说是个问题。如果Map
等同于:
new groovy.json.JsonSlurper().parseText('{"page": 6}')
,我更愿意
[page: new Integer(6)]
是:
JsonSlurper
我已经研究了customising the databinding的各种选项,并且没有一个选项足够早地挂入管道。换句话说,无论我选择哪个选项,请求数据都已由Gson处理。
是否可以用l = ['1','2','3','rt4','rt5']
def reformater(din):
try:
return int(din)
except Exception:
return din
s = [reformater(i) for i in l]
替换Gson作为JSON请求数据的默认解析器?
答案 0 :(得分:2)
是否可以将Json替换为JsonSlurper作为默认解析器 JSON请求数据?
是的,但不是我们记录或提供任何特定支持挂钩的东西。
https://github.com/grails/grails-core/blob/bd7cc10e17d34f20cedce979724f0e3bacd4cdb4/grails-plugin-databinding/src/main/groovy/org/codehaus/groovy/grails/plugins/databinding/DataBindingGrailsPlugin.groovy#L97的数据绑定插件将该类的实例添加到Spring应用程序上下文中。
你可以做的一件事就是编写自己的类,扩展AbstractRequestBodyDataBindingSourceCreator
(或只是实现DataBindingSourceCreator
)并将该类的实例注册为名为jsonDataBindingSourceCreator
的bean,并将替换它与你的默认一个。然后,您可以自己使用您喜欢的任何技术来解析请求的主体并创建Map
。