我正在从API调用中收到一个JSON字符串,并将其反序列化。但是,在尝试访问嵌套结构中的某些键时遇到问题:
当我执行以下操作时,会获得所有外键的列表,但是我不确定如何从那里继续。
<cfset jsonData = deserializeJSON(httpResp.fileContent) />
<cfloop collection="#jsonData#" item="i">
<cfoutput>
<br>#i#
</cfoutput>
</cfloop>
最终,我需要在street
元素中获取barcode
数组数据sku
和items
。我尝试使用点表示法,但收到错误:
您试图取消引用类型为class的标量变量 java.lang.String作为具有成员的结构。
答案 0 :(得分:3)
错误仅表示您的路径错误,并且代码将某些内容视为实际上只是字符串的结构。尽管数据结构可能与in your other thread不同,但是如何访问值的概念却是相同的。您只需要找到所需键的正确路径即可。请记住,JSON是一种非常简单的格式。它本质上由两种对象类型组成:结构和数组。因此,访问ANY元素仅需要正确的一系列键名称和/或数组位置。
通常可以使用点符号访问结构键。但是,如果键名不符合CF's variable naming rules,则需要使用associative array notation(或两者结合使用):
someStructure.path.to.keyname <== dot-notation
someStructure["path"]["to"]["keyname"] <=== associative array notation
someStructure.path["to"].keyname <=== mix of both
街道元素
访问此元素非常简单。密钥名称是有效的变量名称,因此可以使用点符号进行访问。由于它的 value 是一个数组,因此,如果您只想在该数组中使用 specific 元素,则还需要提供位置:
addresses.customer.street[1] <=== first element
addresses.customer.street[2] <=== second element
条形码元素
类似地,barcode
是嵌套结构内的键。但是,有两个区别。一些父键名称包含无效字符(破折号),因此您不能使用点符号来访问“条形码”。另外,某些父键似乎是动态的:
items.{dynamic_uuid}.metadata.barcode
由于您不会提前知道它们,因此访问它们的唯一方法是动态遍历父结构(items
)键并使用关联符号:
<!--- demo structure --->
<cfset props = {items : {"#createUUID()#" : {metadata : {barcode :"759855743302"}} } }>
<cfloop collection="#props.items#" item="dynamicKey">
<cfoutput>
barcode = #props.items[dynamicKey].metadata.barcode#
</cfoutput>
</cfloop>