ColdFusion 8:将OData响应转换为数组

时间:2017-02-07 23:52:59

标签: json coldfusion odata

我正在尝试使用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”方法(非常感谢你!),不幸的是,我遇到了同样的错误。

再次感谢! 富

1 个答案:

答案 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现在包含一组结构。所以你需要这样引用它。

enter image description here

问题更新前的原始答案

使用更新的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>

该代码给出了这个输出:

enter image description here

以下是从新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>

该代码给出了这个输出:

enter image description here

我创建了一个包含所有这些代码的要点,您可以使用 - TryCF Gist 1