Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails ';as';和铸造_Grails_Groovy - Fatal编程技术网

Grails ';as';和铸造

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} 如果列表包含多个项,则两个项

使用Grails,可以:

[[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类处理

以下是它的工作原理:

  • grails.converters.JSON
    是grails
    converters
    插件的一部分
  • 转折点在于,它确实有效地使用了Groovy的
    asType
    ,确保转换器(在本例中为JSON)基于应用程序上下文实例化
  • 并且在转换器上设置
    目标。目标是代理(在您的示例中,列表中有一个元素
    [[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我用结果编辑了这个问题:)