如何在ColdFusion中遍历嵌套JSON结构获取节点信息
在ColdFusion中遍历嵌套JSON结构(含差异化字段节点)
1. 解析JSON字符串为ColdFusion数据结构
先用deserializeJSON()把原始JSON字符串转换成CF可识别的结构体/数组:
<cfset rawJSON = "你的原始JSON字符串"> <cfset jsonData = deserializeJSON(rawJSON)>
2. 定位目标数组(acList)
从解析后的结构体中取出飞机列表数组:
<cfset aircraftList = jsonData.acList>
3. 遍历每个飞机节点(处理差异化字段)
由于每个飞机节点的字段数量不一致,需要动态遍历节点的所有键值对,以下提供两种实现方式:
方式一:使用structKeyList遍历(兼容所有CF版本)
<cfloop array="#aircraftList#" index="currentAircraft"> <h4>飞机详情</h4> <!--- 获取当前节点的所有键名,转为逗号分隔列表 ---> <cfset fieldNames = structKeyList(currentAircraft, ",")> <cfloop list="#fieldNames#" index="fieldName"> <p><strong>#fieldName#</strong>: #currentAircraft[fieldName]#</p> </cfloop> </cfloop>
方式二:使用structEach函数(ColdFusion 2018及以上版本)
更简洁的遍历方式,直接迭代结构体的键值对:
<cfloop array="#aircraftList#" index="currentAircraft"> <h4>飞机详情</h4> <cfscript> structEach(currentAircraft, function(fieldValue, fieldName) { writeOutput("<p><strong>" & fieldName & "</strong>: " & fieldValue & "</p>"); }); </cfscript> </cfloop>
4. 处理嵌套结构(可选)
如果飞机节点内部还有嵌套的结构体或数组,可通过递归函数展开所有层级:
<cffunction name="renderNestedData" access="public" returntype="string"> <cfargument name="data" required="true"> <cfset var outputStr = ""> <cfif isStruct(arguments.data)> <cfset outputStr &= "<ul>"> <cfloop list="#structKeyList(arguments.data)#" index="key"> <cfset outputStr &= "<li><strong>#key#</strong>: " & renderNestedData(arguments.data[key]) & "</li>"> </cfloop> <cfset outputStr &= "</ul>"> <cfelseif isArray(arguments.data)> <cfset outputStr &= "<ol>"> <cfloop array="#arguments.data#" index="item"> <cfset outputStr &= "<li>" & renderNestedData(item) & "</li>"> </cfloop> <cfset outputStr &= "</ol>"> <cfelse> <cfset outputStr &= arguments.data> </cfif> <cfreturn outputStr> </cffunction> <!--- 调用递归函数展示所有数据 ---> <cfloop array="#aircraftList#" index="currentAircraft"> <h4>飞机详情(含嵌套结构)</h4> #renderNestedData(currentAircraft)# </cfloop>
内容的提问来源于stack exchange,提问作者Mike Savoy
相关产品推荐
相关产品推荐

