我有一个以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
答案 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之前的版本。
使用struct function setMetadata指定元数据。
元数据是一个结构,其中每个键都是结构键,每个键的值指定了如何使用JSON序列化的信息。
键的值可以是字符串或结构。
值为字符串
metadata = {firstname:&#34; string&#34;}};
作为结构的值
metadata = {firstname:{type:&#34; string&#34;}};
示例:
<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;
对于CF11 +中的查询: Adobe报告说他们已修复this issue。
答案 6 :(得分:-2)
我会尝试javacasting它:key = javacast("string", "yes")
。这应该强制CF将其识别为字符串而不是布尔值。