我写了以下组件:
<cfcomponent>
<cffunction name="test" returntype="struct" access="remote" returnformat="json">
<cfset local.str = structNew()>
<cfset str.a = "hello">
<cfset str.b = 23>
<cfreturn local.str>
</cffunction>
</cfcomponent>
当我在开发环境中运行时,我得到以下内容:
{"A":"hello","B":"23"}
在制作中,我明白了:
{"A":"hello","B":23}
相同的代码,相同的CF版本,相同的JVM,不同的结果。有谁知道为什么?
答案 0 :(得分:1)
这似乎是CF9中的错误。不确定如何从本地/生产版本获得不同的结果。有关详细讨论,请参阅此博客文章:
http://coldfusion.tcs.de/adobe-please-fix-coldfusion-serializejson/
看起来你有四种选择。
答案 1 :(得分:0)
如果您使用Struct
而不是cfscript
设置cfset
的成员,您会得到不同的结果吗? e.g:
<cfscript>
str.a = "hello";
str.b = 23;
</script>
您也可以尝试将cfset
作为:
<cfset str.b = Int(23)>
我没有看到所描述的行为,可能其中一种方法会有所帮助。
另一种铸造方法。怎么样尝试:
<cfset str.b = JavaCast("int", 23)>
答案 2 :(得分:0)
之前我注意到类似的问题,但从未关注机器/环境之间的确切结果。看起来我们在试图将弱类型语言转换为强类型语言时遇到了麻烦。
要检查的一些事项
CF服务器的修补程序或修补程序有何不同?
每次运行结果是否一致,或者即使在同一台机器上偶尔也会发生变化?例如,如果重新启动CF,稍微更改文件(强制重新编译),然后多次运行它,第一次运行的结果是否比以后运行的结果不同?
如果var scope local.str?
要考虑的另一个选择是使用CFJSON,我相信它更加一致,序列化然后输出字符串。我们使用它是我们的主要应用程序(当前的维护者实际上是一位为我们做了一些工作的顾问)。
答案 3 :(得分:0)
检查一下。
任何完全数字字符串,尾随D或F后跟空格。
<cfscript>
struct = { "wtf" = "4D " };
string = serializeJSON( struct );
string == {"wtf":4D }
</cfscript>
尝试反序列化。
<cfscript>
struct = deserializeJSON( '{"wtf":4D }' );
</cfscript>
JSON解析在字符9处失败:{“wtf”:4D}中的“D”
嗯嗯??
解析器修剪并检查最后一个字符是D还是F(double或float)并将其剥离。如果剩余的字符是数字,则不添加引号。
如果你没有尾随空格,那就完美了。数字,D | F和空格的特定组合使其跳跃。
(我已将其提交给Adobe cfbugs)