Coldfusion JSON序列化不一致

时间:2011-12-28 20:14:27

标签: json coldfusion

我写了以下组件:

<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,不同的结果。有谁知道为什么?

4 个答案:

答案 0 :(得分:1)

这似乎是CF9中的错误。不确定如何从本地/生产版本获得不同的结果。有关详细讨论,请参阅此博客文章:

http://coldfusion.tcs.de/adobe-please-fix-coldfusion-serializejson/

看起来你有四种选择。

  1. 修改代码以期望字符串而不是数字
  2. 将您的CF服务器回滚到9.0
  3. 使用Railo代替Adobe CF
  4. 切换到其他JSON序列化程序。显然有两个名为CFJSON:http://cfjson.riaforge.org/和Dan Roberts的建议http://www.epiphantastic.com/cfjson/

答案 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)

之前我注意到类似的问题,但从未关注机器/环境之间的确切结果。看起来我们在试图将弱类型语言转换为强类型语言时遇到了麻烦。

要检查的一些事项

  1. CF服务器的修补程序或修补程序有何不同?

  2. 每次运行结果是否一致,或者即使在同一台机器上偶尔也会发生变化?例如,如果重新启动CF,稍微更改文件(强制重新编译),然后多次运行它,第一次运行的结果是否比以后运行的结果不同?

  3. 如果var scope local.str?

  4. ,是否会发生任何变化

    要考虑的另一个选择是使用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)