【问题标题】:Groovy differences between 'as' and casting'as' 和 cast 之间的 Groovy 差异
【发布时间】:2013-10-21 12:05:55
【问题描述】:

使用 Grails,这:

[[a:1]] as grails.converters.JSON 

返回与

不同的东西
(grails.converters.JSON)[[a:1]]

但两者都或多或少按预期工作,所以我假设这两个调用都由 JSON 类处理,但由不同的方法(或参数)处理。

我知道as 调用了asType 方法,但是调用强制转换时调用的是什么?

编辑:

我最初认为它不相关,但为了完整起见,'as' 返回

[{"a":1}]

当演员回归时

{"a":1}

如果列表包含多个项目,则两者都返回相同的值。此外,在这两种情况下,这两种方法都返回一个类为 grails.converters.JSON 的对象。

如果它增加了任何价值,我尝试使用 Grails 2.2.4。

【问题讨论】:

  • 每次调用得到的不同结果是什么?
  • @tim_yates 我用结果编辑了问题:)

标签: grails groovy


【解决方案1】:

这是它的工作原理:

  • grails.converters.JSON 是 grails 的 converters 插件的一部分。
  • 转折点,它确实在ConvertersApi 中有效地使用了Groovy 的asType,这确保了转换器(在本例中为JSON)基于应用程序上下文进行实例化。
  • 并且在转换器上设置了target。目标是委托(在您的示例中,列表具有一个元素 [[a:1]]
  • 您在手动对集合进行类型转换时看到的唯一区别是目标未在转换器中设置。因此,转换过程中缺少一个链接。
  • 基于转换器的基础,它会尝试自行将集合转换为JSONObjectJSONArray,而不用担心目标是什么。

测试方法如下:

@Grab('org.json:json:20090211')
import grails.converters.JSON
import org.json.*

println([[a:1]] as JSON) //Gives [{"a":1}], works as expected
println((JSON)[[a:1]]) //Gives {"a":1} since target on converter is not set

//Manual typecast + set target
def op = (JSON)[[a:1]] //or op = new JSON([[a:1]])
op.setTarget([[a:1]])

println op //[{"a":1}] expected result because target is set

//Basic typecast to JSONObject
println((JSONObject)[[a:1]]) //{"a":1}

//With manual casting it behaves as if casted with JSONObject or JSONArray
assert ((JSON)[[a:1]]).toString() == ((JSONObject)[[a:1]]).toString()
assert ((JSON)[[a:1],[b:2]]).toString() == ((JSONArray)[[a:1],[b:2]]).toString()

//Extra massaging done by JSON converter on object
//which is not available when manually casted
JSONObject.valueToString([[a:1]]) //[{"a":1}]

【讨论】:

    【解决方案2】:
    [[a:1]] as grails.converters.JSON 
    

    这是由 grails-converters 插件(即 ConvertersGrailsPlugin.groovy)处理的,该插件旨在让您能够非常快速地将域对象、映射和列表转换为 JSON 或 XML,从而简化基于 AJAX 的应用程序的开发。该插件利用了 groovy “as” 运算符并扩展了 grails 控制器中的 render 方法,以将结果直接发送到输出流。它还为 XML 和 JSON 添加了 Grails Codecs 机制。其中:

    (grails.converters.JSON)[[a:1]]
    

    是对 JSON 对象的类型转换。我认为这将帮助您理解这是两个不同的方面,而不是由 JSON 类处理。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-05
      • 1970-01-01
      • 1970-01-01
      • 2023-02-13
      • 2020-05-02
      相关资源
      最近更新 更多