【问题标题】:Grails : How to access the params coming as JSON formatGrails:如何访问以 JSON 格式提供的参数
【发布时间】:2013-10-03 13:49:37
【问题描述】:

从 PHP 应用程序调用 grails 控制器,它以 JSON 格式发送数据。

当我打印参数时

println params 

打印出来的

[{"courseCategory":null,"courseId":null,"show":null,
    "rows":6,"trainers":null,"courses":null,"cities":null,
    "fromDate":null,"toDate":null,"pageType":"HOME","deal":null}:,   
    action:getTrainingsAsJson, 
    controller:publicTraining]

当我这样做时

println  params.rows
println params.pageType

打印null

我试过了

  def jsonObject = request.JSON  // prints [:]

我也试过JsonSlurper

def slurper = new JsonSlurper()
def result = slurper.parseText(params)

报错

No signature of method: groovy.json.JsonSlurper.parseText() is applicable for argument types: (org.codehaus.groovy.grails.web.servlet.mvc.GrailsParameterMap)

如何将其转换为检索参数值?

或者有什么方法可以将其转换为地图,以便我可以轻松访问参数?

【问题讨论】:

  • println params.dump() 看到了什么?
  • 上面的 println 语句显示无效的 JSON,你确定这是你得到的吗?
  • @dbrin 这有点晚了,但为了后代:它实际上显示了 Grails 用请求参数构建的 params 映射。因为 monda 的 JSON 不是作为参数发送的,所以 Grails 没有分配给 JSON 的名称,而是将其作为映射条目的键。

标签: json grails groovy


【解决方案1】:

如果是 POST 请求,那么 JSON 可以从request 中检索到

request.JSON
request.JSON.courseCategory

等

从请求中可以看出,值是从客户端发送的null。验证有效载荷。

【讨论】:

    【解决方案2】:
    [{"courseCategory":null,...,"deal":null}:, action:getTrainingsAsJson,  controller:publicTraining]
    

    看起来您正在发送没有密钥的数据,例如

    data: JSON.stringify({"courseCategory":null,...,"deal":null}),
    

    用一些密钥发送它

    jQuery.ajax({
        url: '${g.createLink(action: 'asd')}',
        type: 'post',
        dataType: 'json',
        data: "sendData=" + JSON.stringify({"courseCategory":null,"courseId":null,"show":null, "rows":6,"trainers":null,"courses":null,"cities":null, "fromDate":null,"toDate":null,"pageType":"HOME","deal":null}),
        success: function (data) {
            console.debug(data);
        }
    });
    

    然后得到类似的值

    def data = JSON.parse(params.sendData)
    def rows = data.rows
    

    试试这个..,.

    【讨论】:

    • 这在多年后帮助了我!我正在构建 Zendesk 应用程序,但无法在发送端指定 contentType,因为这会导致 Zendesk 框架发送“OPTIONS”标头,而 Grails 2.2.0 无法正确映射该标头。因此,Grails 无法自动解组 JSON 参数。简单地将我的数据变成一个实际参数就像一个魅力。谢谢!
    【解决方案3】:

    如果有人在调用 request.JSON 并接收到 null 时遇到问题 - 请务必明确设置 dataType 和 contentType,并将数据作为 JSON 发送。例如,使用 jQuery:

    $.ajax({
        url: yourURL,
        type: 'POST',
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        data: JSON.stringify(yourJsonObject)
    });
    

    【讨论】:

      【解决方案4】:

      看看JsonSlurper。正如您将看到的,您首先需要解析 JSON 文件,然后以属性访问表示法从 JSON 访问所有字段。

      【讨论】:

      • 你能用上面的例子解释一下吗
      • 更新了我的问题。请看一下
      【解决方案5】:

      Grails 会自动解析/解组 JSON,您可以通过控制器中的 request.JSON 访问它。返回的对象是 JSONObject 类型,它允许以地图样式访问属性。也可以直接使用这个 JSONObject 进行数据绑定

      def jsonObject = request.JSON
      def instance = new YourDomainClass(jsonObject)
      

      【讨论】:

      • 如果我更新单个实例会怎样。
      • 点赞myInstance.properties = jsonObject
      • 它没有得到空值
      • 这个答案完全是从stackoverflow.com/a/3034436/1291122复制和粘贴的
      【解决方案6】:

      def jsonObject = request.JSON def instance = new YourDomainClass(jsonObject)/extensions/default{"sitekey": "your_site_key", "theme": "light"}。

      【讨论】:

        猜你喜欢
        • 2018-05-06
        • 2019-09-06
        • 2018-09-12
        • 2015-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-18
        • 2019-11-17
        相关资源
        最近更新 更多