ColdFusion:如何检查JSON属性是否为null?

时间:2014-03-24 18:58:02

标签: json coldfusion deserialization coldfusion-10

假设我发布了这个简单的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 --->

4 个答案:

答案 0 :(得分:12)

我的错误,我认为JSON中的null会被反序列化为空字符串,但事实并非如此。

JSON中的

null被转换为带有键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 :(得分: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>