IsDefined只能告诉您是否jsonData.addresses.customer.street
存在名为的变量。它无法检查内容,因此在这种情况下它是错误的功能。
假设street
数组始终存在,只需使用成员函数len()或ArrayLen()检查它的大小。如果大小是>= 2
,那么您知道第二个地址存在。
<!--- Option 1: Member function len() --->
<cfif jsonData.addresses.customer.street.len() gte 2 >
2nd address exists, do something
</cfif>
<!--- Option 2: ArrayLen() --->
<cfif arrayLen(jsonData.addresses.customer.street) gte 2 >
2nd address exists, do something
</cfif>
动态“address_x”变量
根据您最终要做的事情,您可能会考虑将地址信息保留为数组,因为在处理动态数量的元素时更容易处理。但是,如果您愿意,也可以address_x
动态定义单独的变量,使用 <cfloop array="..">
<!--- demo data --->
<cfset jsonData.addresses.customer.street = ["Line1","Line2","Line3"]>
<cfloop array="#jsonData.addresses.customer.street#" item="line" index="pos">
<!--- Use the current position to name variables xx_1, xx_2, xx_3 --->
<cfset variables["address_"& pos] = line>
</cfloop>
<!--- results --->
<cfdump var="#variables#">
结果:
关于原始错误
关于IsDefined的一个经常被误解的细节是该函数需要一个变量的名称,该变量通常是一个带引号的纯字符串,例如"myVariable"
. 因为这里的变量名没有引号:
<cfif isDefined( jsonData.addresses.customer.street[2] )>
...该变量被评估,其值是实际传递给 IsDefined() 的值。所以代码最终检查了错误的变量名:
<!--- code is really doing this (thinks address[2] is the variable name) --->
<cfif isDefined("Suite 300")>
触发错误的原因是因为IsDefined()
只接受有效的 CF 变量名。因此它不能用于包含特殊字符(空格、方括号等)的变量名——这意味着它不适用于名为Suite 300
. 该限制是通常推荐使用StructKeyExists()的原因之一。