假设我发布了这个简单的JSON有效负载:
{"foo":null}
在ColdFusion服务器上,如何检查'foo'属性是否为空?
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 --->
答案 0 :(得分:12)
我的错误,我认为JSON中的null
会被反序列化为空字符串,但事实并非如此。
null
被转换为带有键foo
的结构,但在CF10中未定义。 (不确定旧的CF版本)
因此,真正的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 :(得分:0)
您如何发布此数据?当你转储变量“json”时你会得到什么?
如果要将数据发布到ColdFusion,则每个参数都应转换为FORM范围的变量。检查HTTP POST的标头以查看数据的发送方式。
如果它们作为单独的参数发送,您应该能够检查<cfif structKeyExists(form, "foo")>
,然后检查form.foo
的值是否为空字符串。 (ColdFusion将NULL值转换为空字符串。)
答案 2 :(得分:0)
我使用Raillo。
Railo 4.1.3.005错误(表达式) 消息来自键[FOO]的值为NULL,这与CFML中不存在的相同。
但我们可以使用Full Null支持。可以根据需要对其进行适当检查。
<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版本是什么?
答案 3 :(得分:0)
实际上,一个真正的JSON null值应该转换为&#39; null&#39;通过Coldfusion同样令人讨厌但可管理
如果你只在结构中存储一个空字符串,如下所示:
<cfset s = StructNew()>
<cfset s.test = "" />
<cfset json = SerializeJSON(s)>
<cfdump var="#json#">
<cfset d = DeserializeJSON(json)>
<cfdump var="#d#">
你得到以下json:{&#34; TEST&#34;:&#34;&#34;} 和d.test是&#34;&#34;
但是如果你在结构中显式存储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值:{&#34; TEST&#34;:null} 并且d.test是&#39; null&#39;
这可能是更可取的,因为你可以这样做:
<cfif StructKeyExists(d,"TEST") AND Compare(d.test,"null") IS 0>