我正在尝试使用OData更新现有的CF8应用程序,以使用新更新的RESTful API响应来使用和加载数组。
以下是有问题的代码...在从使用OData jSON字符串响应的API中提取数据后,代码会在循环中的最后一行上爆炸
<!--- Returned data is in json format so must change to an array. --->
<cfset local.result = deserializeJSON(myResult)>
<!--- Reference the array collection of categories --->
<cfset local.collection = local.result>
<!--- Initialize the output object --->
<cfset local.output = arrayNew(1)>
<!--- Loop over the collection --->
<cfloop from="1" to="#arrayLen(local.collection)#" index="local.arrayIndex">
...
使用之前的JSON响应可以正常工作:
[
{
"id": 1,
"name": "Blah, blah",
}
]
引入的唯一更改是更新的JSON响应:
[
{
"@odata.context": "string",
"value": [
{
"id": 1,
"name": "Blah, blah"
}
]
}
]
我确定我错过了一些基本的东西,但我从来没有在CF上工作过,所以这里是新的领域。
思想?
谢谢!
更新 抱歉没有提供更多细节。以下是应用当前使用响应的方式:
<!--- Loop over the collection --->
<cfloop from="1" to="#arrayLen(local.collection)#" index="local.arrayIndex">
<!--- Create a reference to the array element --->
<cfset local.objectInstance = local.collection[local.arrayIndex]>
<!--- Create a new object reference --->
<cfset local.thisObject = structNew()>
<!--- Seed the object properties --->
<cfset local.thisObject.categoryId = local.objectInstance.id>
<cfset local.thisObject.categoryName = local.objectInstance.name>
<!--- Place the new object in the collection array --->
<cfset arrayAppend(local.output, duplicate(local.thisObject))>
</cfloop>
这是我收到的错误:
Error Occurred While Processing Request
Object of type class coldfusion.runtime.Struct cannot be used as an array
The error occurred in <path to file> line 97
“第97行”是上述更新中可用的开始循环:
我确实尝试过使用Miguel提供的“newJSON”方法(非常感谢你!),不幸的是,我遇到了同样的错误。
再次感谢! 富
答案 0 :(得分:2)
用户发布更多信息后更新
如果您仍然收到错误,那么您做错了。您必须更改引用新JSON数据对象的方式。我使用您提供的更新代码创建了一个新Gist,以便您了解其工作原理 - TryCF Gist 2
基本上<cfloop>
中的代码需要看起来像这样。再次注意,实际上有两个<cfloop>
块。这是因为新的JSON格式生成了一个包含另一个数组的数组。
<!--- Loop over the collection --->
<cfloop from="1" to="#arrayLen(local.collection)#" index="local.arrayIndex">
<cfloop from="1" to="#arrayLen(local.collection[local.arrayIndex].value)#" index="local.arrayIndex2">
<!--- Create a reference to the array element --->
<cfset local.objectInstance = local.collection[local.arrayIndex].value>
<!--- Create a new object reference --->
<cfset local.thisObject = structNew()>
<!--- Seed the object properties --->
<cfset local.thisObject.categoryId = local.objectInstance[local.arrayIndex2].id>
<cfset local.thisObject.categoryName = local.objectInstance[local.arrayIndex2].name>
<!--- Place the new object in the collection array --->
<cfset arrayAppend(local.output, duplicate(local.thisObject))>
</cfloop>
</cfloop>
有关详细信息,请参阅Gist,但这会像以前一样分配local.output
数组。在原始代码中,循环中的local.objectInstance
是一个结构。使用新的JSON格式,循环中的local.objectInstance
现在包含一组结构。所以你需要这样引用它。
问题更新前的原始答案
使用更新的JSON,您需要更新代码引用数据的方式(原始帖子中未包含该数据)。做一些假设我可以告诉你如何使用你给出的例子来引用数据。
首先是您的原始示例。以下是一些可以为您引用和输出数据的代码。请注意,我添加了<cfdump>
标记。您需要在需要查看数据的情况下使用它。 deserializeJSON()
函数为您解析JSON并创建ColdFusion结构数组。
<cfset oldJSON = '[ { "id": 1, "name": "Blah, blah" } ]'>
<!--- Returned data is in json format so must change to an array. --->
<cfset local.result = deserializeJSON(oldJSON)>
<!--- Reference the array collection of categories --->
<cfset local.collection = local.result>
<!--- Initialize the output object --->
<cfset local.output = arrayNew(1)>
<cfdump var="#local.result#" label="Old JSON">
<!--- Loop over the collection --->
<cfoutput>
<cfloop from="1" to="#arrayLen(local.collection)#" index="local.arrayIndex">
<p>#local.arrayIndex# - #local.collection[local.arrayIndex].id# - #local.collection[local.arrayIndex].name#</p>
</cfloop>
</cfoutput>
该代码给出了这个输出:
以下是从新JSON格式检索相同值所需的更新代码示例。请注意,我添加了另一个cfloop
来引用数据,因为现在有两个数组。
<cfset newJSON = '[ { "@odata.context": "string", "value": [ { "id": 1, "name": "Blah, blah" } ] } ]'>
<!--- Returned data is in json format so must change to an array. --->
<cfset local.result = deserializeJSON(newJSON)>
<!--- Reference the array collection of categories --->
<cfset local.collection = local.result>
<!--- Initialize the output object --->
<cfset local.output = arrayNew(1)>
<cfdump var="#local.result#" label="New JSON">
<!--- Loop over the collection --->
<cfoutput>
<cfloop from="1" to="#arrayLen(local.collection)#" index="local.arrayIndex">
<cfloop from="1" to="#arrayLen(local.collection[local.arrayIndex].value)#" index="local.arrayIndex2">
<p>#local.arrayIndex# - #local.arrayIndex2# - #local.collection[local.arrayIndex].value[local.arrayIndex2].id# - #local.collection[local.arrayIndex].value[local.arrayIndex2].name#</p>
</cfloop>
</cfloop>
</cfoutput>
该代码给出了这个输出:
我创建了一个包含所有这些代码的要点,您可以使用 - TryCF Gist 1