ColdFusion jQuery getJSON: получение WDDX вместо JSON - PullRequest
7 голосов
/ 24 января 2011

Я использую функцию холодного слияния Брайана Ринальди для преобразования набора данных веб-сервиса dotnet в структуру запросов.Каждый запрос затем возвращается на страницу клиента в виде 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>

Вызов для достижения вышеизложенного следующий:

Я использую returntype = "JSON" в CFC.CFC довольно сложный, и я не думаю, что мне нужно вставить его здесь.Я могу подтвердить, что он определенно генерирует допустимые объекты запроса, которые, по-видимому, успешно преобразовывает функцию преобразования в действительный JSON.Я не знаю, почему он возвращается к клиенту, завернутому в теги wddxPacket.

EDIT - 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>

Ответы [ 3 ]

4 голосов
/ 24 января 2011

Вы создаете JSON вручную, но метод cfc рассматривает это возвращаемое значение как строку, которая будет заключена в пакет WDDX.Вы должны попробовать добавить returnformat="plain" к вашему методу cfc.Также вы используете .getJSON().Вместо этого используйте .get().

. Быстрый просмотр исходного кода jQuery показывает, что getJSON() это просто get() с атрибутом JSON, уже жестко заданным в:

getJSON: function( url, data, callback ) {
  return jQuery.get(url, data, callback, "json");
}
2 голосов
/ 24 января 2011

Всякий раз, когда я возвращал данные JSON из CFC, мои функции обычно выглядят так:

<cffunction name="methodName" access="remote" returnformat="plain" output="false">
<cfset jsonresult = '{
 "somevar1": "val1",
 "somevar2": "val2"}' />

<cfreturn jsonresult/>

0 голосов
/ 03 декабря 2011

Попробуйте запустить CFC через браузер.

Сначала я попробовал <cffunction name="myFunction" returnFormat="JSON"> в CFC и тоже получил WDDX.Затем я изменил его на обычный и запустил прямо через браузер, но он вернул ошибку.Затем снова изменили на JSON и проверили его в браузере.Он вернул JSON, как и ожидалось.

...