使用Grails,这个:
[[a:1]] as grails.converters.JSON
Run Code Online (Sandbox Code Playgroud)
返回不同的东西
(grails.converters.JSON)[[a:1]]
Run Code Online (Sandbox Code Playgroud)
但两者都或多或少地按预期工作,所以我假设两个调用都由JSON类处理,但是由不同的方法(或参数)处理.
我知道as调用asType方法,但是在调用转换时调用了什么?
编辑:
我最初认为它不相关,但为了完整性,'as'返回
[{"a":1}]
Run Code Online (Sandbox Code Playgroud)
而铸造回来了
{"a":1}
Run Code Online (Sandbox Code Playgroud)
如果列表包含多个项目,则两者都返回相同的项目.此外,在这两种情况下,两个方法都返回一个类为grails.converters.JSON的对象.
如果它增加任何值,我尝试使用Grails 2.2.4.
下面是它的工作原理:
grails.converters.JSON是 grailsconverters插件的一部分。asType在ConvertersApi中有效地使用了 Groovy ,这确保转换器(在本例中为 JSON)基于应用程序上下文进行实例化。target在转换器上设置了a 。目标是委托(在您的示例中是一个元素的列表[[a:1]])JSONObject或 aJSONArray自己,而不会打扰目标是什么。以下是它的测试方法:
@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}]
Run Code Online (Sandbox Code Playgroud)
[[a:1]] as grails.converters.JSON
Run Code Online (Sandbox Code Playgroud)
这是由 grails-converters 插件(即 ConvertersGrailsPlugin.groovy)处理的,该插件的目的是让您能够非常快速地将域对象、映射和列表转换为 JSON 或 XML,以简化基于 AJAX 的应用程序的开发。该插件利用groovy“as”运算符并扩展grails控制器中的渲染方法以直接将结果发送到输出流。它还添加了针对 XML 和 JSON 的 Grails 编解码器机制。然而:
(grails.converters.JSON)[[a:1]]
Run Code Online (Sandbox Code Playgroud)
是对 JSON 对象进行类型转换。我认为这将帮助您理解这是两个不同的方面,而不是由 JSON 类处理。:)