2009-12-08 58 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

相關問題