我正在使用Brian Rinaldi的coldfusion函数将dotnet into服务数据集转换为查询结构。然后,每个查询都以JSON的形式返回到客户端页面,以便在jQuery函数中使用。
查询是有效的查询对象。但是,不会返回JSON。取而代之的是WDDX,如下所示:
<wddxPacket version='1.0'>
<header />
<data>
<recordset rowCount='31'
fieldNames='startdate,starttime,subscribercode,dest_number,description,ConnDuration,Callcharge,Usage,ConnType,pages,CallReference,SettingCount'
type='coldfusion.sql.QueryTable'>
<field name='startdate'>
<string>2010-01-30T00:00:00+13:00</string>
<string>2010-01-29T00:00:00+13:00</string>
</field>
</recordset>
</data>
</wddxPacket>使用以下代码:
function internetUsage(){
$.getJSON("system.cfc",{
method:'getInternetUsage',
SessionID:$("#vSessionID").val(),
CustomerCode:$("#vCustomerCode").val(),
FullUserName:$("#selUser").val(),
StartDate:$("#vStartDate").val(),
EndDate:$("#vEndDate").val(),
returnformat:'json',
queryformat:'column'
},function(res,code){
alert('hello'); // THIS NEVER FIRES!
});
}因此,我尝试让CFC将查询转换为JSON并返回JSON化的结果。这种方法的效果要好一些,因为返回了有效的JSON,但它仍然被包装在<wddxPacket>标记中,如下所示:
<wddxPacket version='1.0'><header/><data><string>
{
"recordcount": 31,
"columnlist": "callcharge,callreference,connduration,conntype,description,dest_number,pages,settingcount,startdate,starttime,subscribercode,usage",
"data": [
{
"callcharge": "",
"callreference": "",
"connduration": 86403,
"conntype": "UBS",
"description": "dageorgetti",
"dest_number": "",
"pages": "",
"settingcount": 5,
"startdate": "2010-01-30T00:00:00+13:00",
"starttime": "2010-01-30T00:00:00+13:00",
"subscribercode": "dageorgetti",
"usage": 33.7300
}...<snip>...
...<snip>...
</string></data></wddxPacket>实现上述目标的呼声如下:
function internetUsage(){
$.getJSON("system.cfc",{
method:'getInternetUsage',
SessionID:$("#vSessionID").val(),
CustomerCode:$("#vCustomerCode").val(),
FullUserName:$("#selUser").val(),
StartDate:$("#vStartDate").val(),
EndDate:$("#vEndDate").val(),
jsonEncode:true // the cfc converts query to JSON
},function(res,code){
alert('Hello'); // still not firing
});
}我在CFC中使用了returntype="JSON“。cfc相当复杂,我不认为我需要在这里粘贴它。我可以确认它确实生成了有效的查询对象,转换函数似乎可以成功地将其转换为有效的JSON。我不知道为什么它会返回到包装在wddxPacket标记中的客户端。
编辑- CFC
<cffunction name="invokeInternetUsage" access="remote" returnType="any" output="false">
<cfargument name="SessionID" required="true">
<cfargument name="CustomerCode" required="true">
<cfargument name="FullUserName" required="true">
<cfargument name="StartDate" required="true">
<cfargument name="EndDate" required="true">
<cfset var aTemp = "">
<cftry>
<cfinvoke
webservice="http://Portal/internet.asmx?WSDL"
method="Usage"
returnvariable="aTemp">
<cfinvokeargument name="SessionID" value="#arguments.SessionID#"/>
<cfinvokeargument name="CustomerCode" value="#arguments.CustomerCode#"/>
<cfinvokeargument name="FullUserName" value="#arguments.FullUserName#"/>
<cfinvokeargument name="StartDate" value="#arguments.StartDate#"/>
<cfinvokeargument name="EndDate" value="#arguments.EndDate#"/>
</cfinvoke>
<cfcatch></cfcatch>
</cftry>
<cfreturn aTemp>
</cffunction>
<!--- convertDotNetDataset --->
<cffunction name="convertDotNetDataset" access="remote" returnType="any" output="false"
hint="takes a .Net dataset and converts it to a CF structure of queries">
<cfargument name="dataset" required="true">
<cfset var Local = StructNew()>
<cfset Local.result = structNew() />
<cfset Local.aDataset = arguments.dataset.get_any() />
<cfset Local.xSchema = xmlParse(Local.aDataset[1]) />
<cfset Local.xData = xmlParse(Local.aDataset[2]) />
<!--- Create Queries --->
<cfset Local.xTables = Local.xSchema["xs:schema"]["xs:element"]["xs:complexType"]["xs:choice"] />
<cfloop from="1" to="#arrayLen(Local.xTables.xmlChildren)#" index="Local.i">
<cfset Local.tableName = Local.xTables.xmlChildren[Local.i].xmlAttributes.name />
<cfset Local.xColumns = Local.xTables.xmlChildren[Local.i].xmlChildren[1].xmlChildren[1].xmlChildren/>
<cfset Local.result[Local.tableName] = queryNew("") />
<cfloop from="1" to="#arrayLen(Local.xColumns)#" index="Local.j">
<cfif left(Local.xColumns[Local.j].xmlAttributes.name,6) neq 'Column'>
<cfset queryAddColumn(Local.result[Local.tableName], Local.xColumns[Local.j].xmlAttributes.name, arrayNew(1)) />
</cfif>
</cfloop>
</cfloop>
<!--- see if there are any row of data, if not exit --->
<cfif NOT StructKeyExists(Local.xData["diffgr:diffgram"], "NewDataSet")>
<cfreturn Local.result>
</cfif>
<!--- Populate Queries --->
<cfset Local.xRows = Local.xData["diffgr:diffgram"]["NewDataSet"] />
<cfloop from="1" to="#arrayLen(Local.xRows.xmlChildren)#" index="Local.i">
<cftry>
<cfset Local.thisRow = Local.xRows.xmlChildren[Local.i] />
<cfset Local.tableName = Local.thisRow.xmlName />
<cfset queryAddRow(Local.result[Local.tableName], 1) />
<cfloop from="1" to="#arrayLen(Local.thisRow.xmlChildren)#" index="Local.j">
<cfif left(Local.thisRow.xmlChildren[Local.j].xmlName,6) neq 'Column'>
<cfset querySetCell(Local.result[Local.tableName], Local.thisRow.xmlChildren[Local.j].xmlName, Local.thisRow.xmlChildren[Local.j].xmlText, Local.result[Local.tableName].recordCount) />
</cfif>
</cfloop>
<cfcatch></cfcatch>
</cftry>
</cfloop>
<cfreturn Local.result>
发布于 2011-01-24 13:44:28
您正在手工构建JSON,但cfc方法将返回值视为要包装在WDDX包中的字符串。您应该尝试将returnformat="plain"添加到您的cfc方法中。另外,您使用的是.getJSON()。相反,请使用.get()。
快速浏览一下jQuery源代码就会发现,getJSON()只是一个get(),其中已经硬编码了JSON属性:
getJSON: function( url, data, callback ) {
return jQuery.get(url, data, callback, "json");
}发布于 2011-01-24 08:11:32
每当我从一个CFC返回JSON数据时,我的函数往往是这样的:
<cffunction name="methodName" access="remote" returnformat="plain" output="false">
<cfset jsonresult = '{
"somevar1": "val1",
"somevar2": "val2"}' />
<cfreturn jsonresult/>
发布于 2011-12-03 08:49:15
尝试通过浏览器运行CFC。
我首先在CFC中尝试了<cffunction name="myFunction" returnFormat="JSON">,然后也得到了WDDX。然后我将其更改为普通格式,并直接通过浏览器运行它,但它返回了一个错误。然后再次更改为JSON,并使用浏览器进行检查。不出所料,它返回了JSON。
https://stackoverflow.com/questions/4777089
复制相似问题