2014-03-24 25 views
3

比方說,我張貼此簡單的JSON有效載荷:ColdFusion:如何檢查JSON屬性是否爲空?

{"foo":null} 

在ColdFusion服務器,我該如何檢查,如果「富」屬性爲null?

IsDefined將不起作用,因爲它對於空值將爲false。 IsNull不會工作,因爲IsNull對於空值不僅適用,還適用於缺少的屬性。

<cfset json = DeserializeJSON(GetHttpRequestData().content) /> 
<cfdump var="#IsDefined("json.foo")#" /> <!--- false ---> 
<cfdump var="#IsNull(json.foo)#" /> <!--- true ---> 
<cfdump var="#IsNull(json.bar)#" /> <!--- true ---> 

回答

10

我的錯誤,我想null在JSON將被反序列化的空字符串,但事實並非如此。

null在JSON中被翻譯爲結構體密鑰foo,但在CF10中未定義。 (不知道舊的CF版)

enter image description here

因此,一個真正的isStructValueNull()可以這樣寫:

function isStructValueNull(struct, key) { 
    return listFind(structKeyList(struct), key) 
      && !structKeyExists(struct, key); 
} 

json = deserializeJSON('{"foo":null,"bar":123}'); 

writeDump(isStructValueNull(json, "foo")); // yes 
writeDump(isStructValueNull(json, "bar")); // no 

或者可以遍歷json和使用structKeyExists(),如果是假的,這是空值。

function structNullKeyList(struct) { 
    var nulls = ""; 
    for (var key in struct) 
     if (!structKeyExists(struct, key)) 
     nulls = listAppend(nulls, key); 
    return nulls; 
} 

writeDump(structNullKeyList(json));   // 'foo' 
+1

雖然這是痛苦的(如在ColdFusion的大多數事情),好像這是CF10的最佳途徑。 –

0

你是怎麼發佈這個數據的?當你轉儲變量「json」時,你會得到什麼?

如果要發佈數據的ColdFusion,每個參數應該得到轉換爲窗體作用域的變量。檢查HTTP POST的標題以查看數據的發送方式。

如果它們作爲單獨參數發送,您應該能夠檢查<cfif structKeyExists(form, "foo")>,然後檢查form.foo的值是否爲空字符串。 (ColdFusion的平移一個NULL值設置爲空字符串。)

+0

如果內容類型是application/x-www-form-urlencoded,它只是表單的作用域。我正在使用JSON,所以它不會被限定範圍。 –

0

我使用Raillo。

Railo 4.1.3.005錯誤(表達式) 消息來自鍵[FOO]的值爲NULL,與CFML中不存在的值相同。

但是我們可以使用Full Null suport。只要你想要,它可以被正確地檢查。

<cfscript> 

    objectValues = { 'one' : 1 , 'two' : 2 , 'three' : JavaCast("null", 0) , 'four' : null }; 

    dump(objectValues); 

    // Known existing attribute 
    dump('three'); 
    dump(isDefined('objectValues.three')); 
    dump(isNull(objectValues.three)); 
    dump(StructKeyExists(objectValues,'three')); 

    // Known Railo Null value 
    dump('four'); 
    dump(isDefined('objectValues.four')); 
    dump(isNull(objectValues.four)); 
    dump(StructKeyExists(objectValues,'four')); 

    // Unknown existing attribute 
    dump('five'); 
    dump(isDefined('objectValues.five')); 
    dump(isNull(objectValues.five)); 
    dump(StructKeyExists(objectValues,'five')); 

</cfscript> 

什麼是您的ColdFusion版本?

+0

CF10。 @亨利的答案似乎運作良好。在CF10中的 –

0

其實真正的JSON空值應該由ColdFusion的被翻譯成「空」如果你在結構中只存儲一個空字符串這樣它同樣惱人的,但管理

<cfset s = StructNew()> 
<cfset s.test = "" /> 
<cfset json = SerializeJSON(s)> 
<cfdump var="#json#"> 
<cfset d = DeserializeJSON(json)> 
<cfdump var="#d#"> 

你得到以下json:{「TEST」:「」} 和d。測試 「」

但是,如果你明確地存儲一個Java null的結構是這樣的:

<cfset s = StructNew()> 
<cfset s.test = javaCast("null", "") /> 
<cfset json = serializeJSON(s)> 
<cfdump var="#json#"> 
<cfset d = DeserializeJSON(json)> 
<cfdump var="#d#"> 

您會收到以下JSON值:{ 「TEST」:空} 和d.test是'空」

這可能是因爲你可以這樣做更可取:

<cfif StructKeyExists(d,"TEST") AND Compare(d.test,"null") IS 0> 
+1

,d.test不是'null'。我試圖轉儲d.test,它說「元素測試在D中未定義」。在CF10中。 – Henry

+0

老年人CF將null翻譯爲「null」?哎喲。我無法驗證這一點,因爲我使用的是CF10。 –