使用SerializeJSON防止ColdFusion将字符串转换为数字

Sco*_*try 13 javascript coldfusion json coldfusion-9

我有ColdFusion 9.0.1与最新的修补程序(4).我需要ColdFusion来返回所有带有引号的JSON数据(作为字符串).我有以下问题:

<cfset test = StructNew()>
<cfset test.name = "1234.100">
<cfoutput>#SerializeJSON(test)#</cfoutput>
Run Code Online (Sandbox Code Playgroud)

输出的文字是:

{"name":1234.100}
Run Code Online (Sandbox Code Playgroud)

每个javascript JSON解析器都将其转换为1234.1并且不保留尾随0.我需要ColdFusion输出为字符串或javascript解析器以保持尾随0.有任何想法吗?

这是一个简化的例子.我从数据库中获取这些数据.

Luk*_*uke 8

这是一个解决方案 - 虽然是一个非常hacky,不优雅的解决方案......

你的设置:

var test = {
  name = "1234.100"
};
Run Code Online (Sandbox Code Playgroud)

在前面添加一些明显的字符串会强制该值在转换为JSON时成为字符串.然后我们摆脱这个丑陋的字符串.

var thisIsSuchAHorribleHack = "(!@$!@$)";
test.name = thisIsSuchAHorribleHack & test.name;
var serializedTest = SerializeJSON(test);
serializedTest = Replace(serializedTest, thisIsSuchAHorribleHack, "", "ALL");
writeOutput(serializedTest);
Run Code Online (Sandbox Code Playgroud)


Fre*_*ntz 7

我知道这个问题已经很久了,但是作为一个新的CF开发人员,我遇到了同样的问题,尽管我成功地使用了上面的“字符串Hack”,但最终我从Cold Fusion文档中找到了一个更合适的解决方案serializeJSON

借助Adobe ColdFusion(2016版)更新2,您可以为结构中的键指定数据类型信息。这就是所谓的元数据。

<cfscript>
   example = structnew();
   example.firstname = "Yes";
   example.lastname = "Man";
   writeoutput("<b>After serialization</b>:");
   // change the JSON key firstname to fname 
   metadata = {firstname: {type:"string",name:"fname"}};
   example.setMetadata(metadata);
   writeoutput(SerializeJSON(example));
</cfscript>
Run Code Online (Sandbox Code Playgroud)

尽管该示例显示了修改字符串'Yes'的元数据,以保留字符串,而不是将其转换为布尔值,但它也可以将数字转换为字符串以进行JSON序列化。


Sco*_*try 1

如果您不想使用 kludge,则可以使用正确编码 JSON 的第三方库。我使用了http://jsonutil.riaforge.org/中的 JSONUtil 。我正在使用 ColdFusion 9,所以我不知道较新版本的 ColdFusion 是否修复了一些编码异常。