ColdFusion JSON对象与对象数组

时间:2014-01-09 19:37:05

标签: arrays json coldfusion

我正在调用smartsheet.com api,他们将返回一个对象或一个数组,我可以使用以下代码将对象处理为CF查询,但是在处理数组时遇到问题。

JSON:

[
{
"id": 2070463980562308,
"name": "Sheet1",
"accessLevel": "OWNER",
"permalink": "https://app.smartsheet.com/b/home?"
},
{
"id": 2810804673243012,
"name": "Project Management",
"accessLevel": "OWNER",
"permalink": "https://app.smartsheet.com/b/home?"
},
{
"id": 3678697304680324,
"name": " - Dispatch Sheets",
"accessLevel": "OWNER",
"permalink": "https://app.smartsheet.com/b/home?"
}
]

我的CF代码:

<cfset jsonData = deserializeJSON(json.smartsheet.sheets.filecontent) />

<!--- Check we have records returned to us --->
<cfif arrayLen(jsonData.sheets)>
<!--- We want to provide the query with column names --->
<cfset strColType       =   '' />
<!--- To do this, we'll take the first result item... --->
<cfset sheets   =   jsonData.sheets[1] />
<!--- and get the list of keys from the structure. --->
<cfset thisKeyList      =   structKeyList(sheets) />
<!---
    We now need to provide the column data type.
    This example assumes everything is a VarChar.
    Looping over the list of keys, we'll append a
    datatype to the column type list defined earlier.
--->
<cfloop list="thisKeyList" index="listItem">
    <cfset listAppend(strColType,'varChar') />
</cfloop>

<!---
    Generate the new query, passing in the  
    column list, column type list and the data.
--->
<cfset qrySheets = queryNew(
thisKeyList,
strColType,
jsonData.sheets
) />

</cfif>

此代码仅在我获取对象时才有效..不是数组。

1 个答案:

答案 0 :(得分:0)

看起来你发布的JSON代码是针对数组而不是对象,所以我会猜测对象返回的内容。

JSON对象很可能在其中返回一个sheets数组,您正在访问jsonData.sheets

JSON数组只是工作表数组。所以试试这段代码:

<!--- default array --->
<cfset sheetArray = [] /> 

<cfset jsonData = deserializeJSON(json.smartsheet.sheets.filecontent) />

<!--- Check we have records returned to us --->

<cfif isArray(jsonData) AND arrayLen(jsonData)>
    <cfset sheetArray = jsonData />
<cfelseif isStruct(jsonData) AND stuctKeyExists(jsonData, "sheets")>
    <cfif isArray(jsonData.sheets) AND arrayLen(jsonData.sheets)>
        <cfset sheetArray  =  jsonData.sheets /> 
    </cfif>
</cfif>

<!--- Check we have records returned to us --->
<cfif arrayLen(sheetArray)>
<!--- We want to provide the query with column names --->
<cfset strColType       =   '' />
<!--- To do this, we'll take the first result item... --->
<cfset sheets   =   sheetArray[1] />
<!--- and get the list of keys from the structure. --->
<cfset thisKeyList      =   structKeyList(sheets) />
<!---
    We now need to provide the column data type.
    This example assumes everything is a VarChar.
    Looping over the list of keys, we'll append a
    datatype to the column type list defined earlier.
 --->
<cfloop list="thisKeyList" index="listItem">
    <cfset listAppend(strColType,'varChar') />
</cfloop>

<!---
    Generate the new query, passing in the  
    column list, column type list and the data.
--->
<cfset qrySheets = queryNew(
    thisKeyList,
    strColType,
    jsonData.sheets
 ) />

</cfif>

BTW,queryNew只有两个参数:QueryNew(columnlist [, columntypelist])所以我不确定这对你有用(必须忽略附加参数)。

http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7f94.html