Grails ';as';和铸造
使用Grails,可以:Grails ';as';和铸造,grails,groovy,Grails,Groovy,使用Grails,可以: [[a:1]] as grails.converters.JSON 返回与 (grails.converters.JSON)[[a:1]] 但这两个调用的工作方式或多或少都与预期的一样,因此我假设这两个调用都是由JSON类处理的,但是由不同的方法(或参数)处理的 我知道as调用asType方法,但是调用强制转换时调用了什么 编辑: 我最初认为这不相关,但为了完整性,“as”返回 [{"a":1}] 当演员回来的时候 {"a":1} 如果列表包含多个项,则两个项
[[a:1]] as grails.converters.JSON
返回与
(grails.converters.JSON)[[a:1]]
但这两个调用的工作方式或多或少都与预期的一样,因此我假设这两个调用都是由JSON类处理的,但是由不同的方法(或参数)处理的
我知道as
调用asType
方法,但是调用强制转换时调用了什么
编辑:
我最初认为这不相关,但为了完整性,“as”返回
[{"a":1}]
当演员回来的时候
{"a":1}
如果列表包含多个项,则两个项都返回相同的值。此外,在这两种情况下,两个方法都返回一个类为grails.converters.JSON的对象
如果它增加了任何价值,我尝试使用Grails2.2.4
[[a:1]] as grails.converters.JSON
grails converters插件(即ConvertersGrailsPlugin.groovy)负责处理此问题,其目的是让您能够非常快速地将域对象、映射和列表转换为JSON或XML,从而简化基于AJAX的应用程序的开发。该插件利用groovy“as”操作符并扩展grails控制器中的render方法,将结果直接发送到输出流。它还为XML和JSON添加了Grails编解码器机制。其中:
(grails.converters.JSON)[[a:1]]
是对JSON对象的执行类型转换。我认为这将有助于您理解这是两个不同的方面,而不是由JSON类处理 以下是它的工作原理:
是grailsgrails.converters.JSON
插件的一部分converters
- 转折点在于,它确实有效地使用了Groovy的
,确保转换器(在本例中为JSON)基于应用程序上下文实例化asType
- 并且在转换器上设置
目标。目标是代理(在您的示例中,列表中有一个元素
)[[a:1]]
- 手动键入集合时所看到的唯一区别是,未在转换器中设置目标。因此,在转换过程中会丢失一个链接
- 基于转换器的基本原理,它尝试将集合自己转换为
或JSONObject
,而不考虑目标是什么JSONArray
@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}]
每次通话的结果有哪些不同?@tim_yates我用结果编辑了这个问题:)