【问题标题】:Array.size() returned wrong values (Grails)Array.size() 返回错误值 (Grails)
【发布时间】:2015-10-12 06:51:19
【问题描述】:

我正在使用 Grails 开发应用程序。我想获取数组的长度。 我得到了错误的值。这是我的代码,

def Medias =  params.medias
println params.medias    // I got [37, 40]
println params.medias.size() // I got 7 but it should be 2

我做错了什么?

感谢您的帮助。

【问题讨论】:

  • 你是如何发布你的参数的?请粘贴代码

标签: grails groovy


【解决方案1】:

什么是 params.medias(在哪里设置)?

如果 Grials 将其视为字符串,则使用 size() 将返回字符串的长度,而不是数组。

做:

println params.medias.length

也返回 7?

您可以使用 assert 关键字检查 Grails 认为对象是什么。

如果确实是字符串,可以试试下面的代码转换成数组:

def mediasArray = Eval.me(params.medias)

println mediasArray.size()

这样做的缺点是,如果 params.medias 由最终用户提供,或者可以在编译代码之外被恶意修改,Eval 可能会执行不需要的代码。

如果您感兴趣(不是我的),这里有一个关于“eval 的邪恶(或缺乏)”的好消息: https://javascriptweblog.wordpress.com/2010/04/19/how-evil-is-eval/

【讨论】:

  • 正如params 所示,代码也可以从外部世界发送,然后使用Eval 将为远程代码执行打开大门。
  • 可能是真的。我已经假设 OP 会意识到这种潜在的风险。我将更新答案以反映这一点。
【解决方案2】:

我认为 7 是字符串长度的结果:“[37,40]”

您的媒体变量似乎是一个数组而不是一个集合

试试:params.medias.length

【讨论】:

  • 可能只是一个字符串
  • 没有这样的属性:类的长度:java.lang.String。 Stacktrace 如下:消息:没有这样的属性:类的长度:java.lang.String
【解决方案3】:

感谢大家。我发现了我的错误

首先,我从客户端发送了一个数组,我的 params.medias 返回了 null,所以我将它转换为字符串,但它是错误的方式。

最后,我从客户端发送和数组作为数组,在 grails 中,我得到了一个参数

params."medias[]"

【讨论】:

  • 你也可以这样写params.list('media')
  • 如果你不确定你得到了什么,那么最好用print obj.inspect()“调试”。 toString 可能非常具有误导性。
【解决方案4】:

【讨论】:

    猜你喜欢
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    • 2014-01-16
    • 2019-10-13
    • 2020-10-05
    • 2015-11-19
    • 2020-05-27
    相关资源
    最近更新 更多