如何解析CF结构

时间:2019-07-18 19:37:08

标签: loops struct coldfusion

我正在从API调用中收到一个JSON字符串,并将其反序列化。但是,在尝试访问嵌套结构中的某些键时遇到问题:

Screen shot of deserialized JSON

当我执行以下操作时,会获得所有外键的列表,但是我不确定如何从那里继续。

<cfset jsonData = deserializeJSON(httpResp.fileContent) /> 

<cfloop collection="#jsonData#" item="i">
<cfoutput>
    <br>#i#
</cfoutput> 
</cfloop>

最终,我需要在street元素中获取barcode数组数据skuitems。我尝试使用点表示法,但收到错误:

  

您试图取消引用类型为class的标量变量   java.lang.String作为具有成员的结构。

1 个答案:

答案 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>