2009-12-08 47 views
13

我有一个数据结构存储在JSON格式,使用serializeJSON函数转换。我遇到的问题是可以在CF中布尔的字符串(如Yes,No,True和False)以布尔值的形式转换为JSON。以下是示例代码。有关如何防止这种情况的任何想法?如何防止SerializeJSON将是/否/真/假字符串更改为布尔值?

代码:

<cfset test = {str='Yes'}> 
<cfset json = serializeJSON(test)> 
<cfset fromJSON = deserializeJSON(json)> 

<cfoutput> 
    #test.str#<br> 
    #json#<br> 
    #fromJSON.str# 
</cfoutput> 

结果:

Yes 
{"STR":true} 
YES 
+2

嗯,我刚想出一个解决方案。在字符串中添加额外的空间是防止它被转换为布尔值的一种方法。这适用于我目前的需求,但任何更好的解决方案将不胜感激,所以我不必在转换之前操作字符串。 – 2009-12-08 15:37:46

+0

即使我自己制作JSON而没有使用serializeJSON() – 2014-09-06 20:31:18

回答

4

在字符串中添加一个额外的空间以防止它被转换为布尔值,然后在稍后阶段进行修剪。

4

我相信你或任何类似的“串逼迫”的解决方法是避免在Adobe CF这样的行为,现在唯一可能的方式。

顺便说一句,按照您的示例,按预期工作。这里是输出:

Yes 
{"STR":"Yes"} 
Yes 

它也适用于尾随零的数字相同的方式。

+0

也得到了同样的问题我们目前正在使用CF8。你知道它如何在CF9中转换? – 2009-12-08 16:09:05

+1

@Dan知道Adobe提供的遗留代码支持的背景,我敢打赌,默认行为还没有改变。但我已经为你检查过了:没有变化。另外手册显示没有新的参数可以覆盖它: http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-79fa.html – Sergii 2009-12-08 16:18:33

+1

在CF9,0,0,251028中它是{ “STR”:true} – Leigh 2009-12-08 16:20:01

-2

我想试试Javacasting它:key = javacast("string", "yes")。这应该强制CF将其识别为字符串而不是布尔值。

+1

没有改变我的测试结果 – 2009-12-22 19:50:17

+0

不起作用...但是,JavaCast对于确保数字是整数而不是浮点数很有用。 – Redtopia 2013-08-23 18:59:17

1

这是哈克,但如果你有条件输出是的,没有为“_yes_”和“_no_”(使用switch语句,然后连载的JSON为字符串后,做一个搜索和替换,它的工作原理。

raw_json=serializeJSON(object); 
raw_json=ReplaceNoCase(raw_json,':"_Yes_"',':"Yes"',"ALL"); 
raw_json=ReplaceNoCase(raw_json,':"_No_"',':"No"',"ALL"); 

至少CF是真的&当你往返的数据

0

我知道这个答案WOU当这个问题被问到时,ld没有工作,但是因为这似乎是人们在研究这个问题时发现的问题,所以我认为用新的修补程序进行更新会很好。

对于那些在CF2016,Adobe公司已经实施了new function,以帮助解决这个问题。这比在字符串前面增加空格要好,尽管如Sergii所描述的那样,这仍然需要在CF2016之前发布。

For Structs in CF2016:

使用结构功能,setMetadata,指定的元数据。

元数据是一个结构,其中每个键是结构键,每个键的值指定有关如何在JSON中序列化的信息。

键的值可以是字符串或结构。

作为字符串的值

metadata = {firstname:“string”}};

值作为结构

元数据= {姓名:{类型: “串”}};

例子:

<cfscript> 
 
     example = structnew(); 
 
     example.firstname = "Yes"; 
 
     example.lastname = "Man"; 
 
     // changing the default serialization by specifying the type of "firstname" as string 
 
     metadata = {firstname: {type:"string"}}; 
 
     example.setMetadata(metadata); 
 
     writeoutput(SerializeJSON(example)); 
 
</cfscript>

的查询在CF11 +: 的Adobe报告说,他们已经固定this issue

+0

什么时候我的数据来自storedproc?我遇到了这个问题,使用cfstoredproc。 SP本身正在返回适当的字符串,但是当它通过cfstoredproc标签进行过滤时,它会发生变化。 – 2017-08-24 18:04:51

+0

@ReverendDovie根据Adobe,CF11和更高版本已经解决了这个问题,无需额外的代码查询,只要您直接将查询转换为JSON – kuhl 2017-08-24 18:06:56

+0

除了它正在为我做。我使用CF2016,并使用cfstoredproc来运行SP。我在SQL开发人员中验证过,SP返回“Yes”,但我在cfstoredproc标签后立即抛弃了数据,并将其重置为true。 – 2017-08-24 18:08:34

相关问题