2012-11-08 71 views
0

我相对较新与其他使用JSON函数的系统进行交互,也许我只是对基本问题进行脑部放屁。Coldfusion 8 JSON - 将返回字符串转换为查询对象

我访问一个API函数,它返回一个查询作为JSON字符串。返回格式是“普通”的。查询运行以选择学校列表并创建一个结构数组作为返回字符串。

"[{\"city\":\"Adrian\",\"state\":\"MI\",\"school\":\"Adrian College\"},{\"city\":\"Albion\",\"state\":\"MI\",\"school\":\"Albion College\"},.........etc. 

所以现在我需要这种/转换成一个查询对象,并使用它,但现在我只觉得自己要在谷歌/测试循环围绕/重新谷歌重新测试。任何关于如何将此变成查询与学校/城市/州作为列的指针?

+0

请记住反斜杠意味着引号正在转义。由于返回类型很简单,API听起来像是一个传递给JavaScript的普通字符串,因此它将采用JSON对象并将其“字符串化”,而不是将其保存为JSON。 –

回答

0

听起来像你需要使用DeserializeJSON()方法。更多信息here

2

首先使用deserializeJson将字符串转换为可用的字符串。

然后,在第一个数组元素上使用StructKeyList以获取在QueryNew中使用的列。

然后做两个环路 - 一个通过阵列做QueryAddRow,含有通过该确实QuerySetCell设定值的列的内环。


沿此线:

<cfset Data = deserializeJson(JsonString) /> 

<cfif NOT ArrayLen(Data)> 
    <cfthrow message="No data" /> 
</cfif> 

<cfset Q = QueryNew(StructKeyList(Data[1])) /> 

<cfloop index="i" array=#Data#> 
    <cfset Row = QueryAddRow(Q) /> 
    <cfloop index="ColName" collection=#Data[i]# > 
     <cfset QuerySetCell(Q , ColName , Data[i][ColName] , Row) /> 
    </cfloop> 
</cfloop> 

<cfdump var=#Q# /> 

理想地把它在函数内部(这意味着无功作用域根据需要)。

+0

这就是我所设想的 - 然而反序列化Json失败:'“JSON解析失败在字符1:'<'在 ”[{\ city \“:\”Adrian \“,\”state \“:\”MI \“ ,\“学校\”:\“Adrian College \”} – Steve

+0

然后它可能不是有效的JSON。 [jsonlint.com](http://jsonlint.com/)说什么? –

+0

字符1不是'< - 不知道那里发生了什么 - 但是,如果实际变量包含'“[{\”city \“'etc等等,那么您看起来有一个JSON字符串,它包含一个JSON对象 - 它已经被双重编码了 –

0

解决!有第二个CFC代理所有API请求并验证API凭证。从该代理CFC和代理CFC扩展的所有API CFC都缺少returnformat =“plain”。

只要我们让他们把数据放回原处,数据就会按预期返回。感谢大家的建议。

相关问题