如何防止SerializeJSON将Yes / No / True / False字符串更改为boolean?

时间:2009-12-08 15:33:42

标签: json coldfusion

我有一个以JSON格式存储的数据结构,使用serializeJSON函数进行转换。我遇到的问题是CF中可以布尔的字符串,如Yes,No,True和False,将转换为JSON作为布尔值。下面是示例代码。关于如何防止这种情况的任何想法?

代码:

<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

7 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

我相信您或任何类似的“字符串强制”解决方法是目前唯一可能在Adobe CF中阻止此类行为的方法。

BTW,Railo按照您的例子预期工作。这是输出:

Yes
{"STR":"Yes"}
Yes 

对于带有尾随零的数字,它的工作方式也相同。

答案 2 :(得分:1)

它很hacky,但如果你有条件地输出yes和no作为“_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对这一点非常令人沮丧,真实&amp;当你往返数据时,false会转换为是否

答案 3 :(得分:1)

答案 4 :(得分:1)

对于那些运行 CF2018 和 2021 的人来说,这是个好消息。原始帖子中的代码(来自 2009 年的 cf9)现在确实返回了丹·罗伯茨所期望的:

Yes
{"STR":"Yes"}
Yes

无需在应用、application.cfc、admin 或 jvm 参数中指定任何非默认设置。

奇怪的是,CF2016(即使是最终更新,17)仍然返回:

Yes
{"STR":true}
YES

但正如上面 kuhl 所指出的,您可以使用 setmetadata 函数在 CF2016 中获得所需的行为(当然,它在 2018 年和 2021 年仍然可以正常工作)。在这里,作为脚本:

<cfscript>
   // changing the default serialization by specifying the datatype of the "str" struct key to be  string
   metadata = {str: {type:"string"}};
   test.setMetadata(metadata);
   writeoutput(SerializeJSON(test));
</cfscript>

产生:

{"STR":"Yes"}

答案 5 :(得分:0)

我知道当问题被问到时,这个答案是行不通的,但由于这似乎是人们在研究这个问题时所发现的,我认为用新的修复进行更新会很好。

对于CF2016上的用户,Adobe已实施new function来帮助解决此问题。这比在字符串前面添加一个空格更可取,但是如Sergii所描述的那样仍然需要解决CF2016之前的版本。

For Structs in CF2016:

  

使用struct function setMetadata指定元数据。

     

元数据是一个结构,其中每个键都是结构键,每个键的值指定了如何使用JSON序列化的信息。

     

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

     

值为字符串

     

metadata = {firstname:&#34; string&#34;}};

     

作为结构的值

     

metadata = {firstname:{type:&#34; string&#34;}};

示例:

&#13;
&#13;
<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>
&#13;
&#13;
&#13;

对于CF11 +中的查询: Adobe报告说他们已修复this issue

答案 6 :(得分:-2)

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