将JSON请求数据绑定到命令对象

时间:2017-08-29 09:59:26

标签: json grails data-binding

在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请求数据的默认解析器?

1 个答案:

答案 0 :(得分:2)

  

是否可以将Json替换为JsonSlurper作为默认解析器   JSON请求数据?

是的,但不是我们记录或提供任何特定支持挂钩的东西。

默认的JSON数据绑定源创建者位于https://github.com/grails/grails-core/blob/v2.5.6/grails-web-databinding/src/main/groovy/org/codehaus/groovy/grails/web/binding/bindingsource/JsonDataBindingSourceCreator.groovy

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